using System.Collections; using System.Collections.Generic; using UnityEngine; using NaughtyAttributes; using Unity.VisualScripting; using UnityEngine.Events; /// /// /// public class BoatRowController : MonoBehaviour { #region Inspector Fields public Transform m_oarTip; public UnityEvent m_OnRow; public UnityEvent m_OnBrake; public int velocityOverFrames = 8; #endregion Inspector Fields #region Private Fields private Vector3 m_lastKnownOarPosition; private Queue m_velocityQueue = new Queue(); #endregion Private Fields #region Getters #endregion Getters #region MonoBehaviour Functions /// /// OnEnable is called when the object becomes enabled and active. /// private void OnEnable() { } /// /// OnDisable is called when the behaviour becomes disabled. /// private void OnDisable() { } /// /// Update is called once per frame /// private void Update() { } #endregion MonoBehaviour Functions #region Class Functionality private void OnTriggerEnter(Collider other) { OarController oar = other.GetComponentInParent(); if (oar != null) { m_lastKnownOarPosition = transform.InverseTransformPoint(m_oarTip.position); m_velocityQueue = new Queue(); } } void OnTriggerStay(Collider other) { OarController oar = other.GetComponentInParent(); if(oar != null) { Vector3 localOarTipPosition = transform.InverseTransformPoint(m_oarTip.position); Vector3 direction = m_lastKnownOarPosition - localOarTipPosition; float directionality = Vector3.Dot(direction,Vector3.forward); m_velocityQueue.Enqueue(directionality * Time.deltaTime); if(m_velocityQueue.Count > velocityOverFrames) { m_velocityQueue.Dequeue(); } float averageVelocity = 0; if (m_velocityQueue.Count > 0) { var v_arr = m_velocityQueue.ToArray(); for(int i = 0; i < v_arr.Length; i++) { averageVelocity += v_arr[i]; } averageVelocity /= v_arr.Length; } if (averageVelocity > 0) { if(averageVelocity < 0.000001) { m_OnBrake.Invoke(); Debug.Log($"Brake! ({averageVelocity})"); } else { Debug.Log($"Row! ({averageVelocity})"); m_OnRow.Invoke(averageVelocity); } } else { Debug.Log($"No Row: {averageVelocity}"); m_OnBrake.Invoke(); } m_lastKnownOarPosition = localOarTipPosition; } else { Debug.Log($"Not Oar: {other.gameObject}"); } } #endregion Class Functionality #region Editor Functions /// /// Called when the Component is created or Reset from the Inspector /// private void Reset() { //useful for finding components on creation } #endregion Editor Functions }