|
|
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using NaughtyAttributes;
- using Unity.VisualScripting;
- using UnityEngine.Events;
-
- /// <summary>
- ///
- /// </summary>
- public class BoatRowController : MonoBehaviour
- {
-
- #region Inspector Fields
- public Transform m_oarTip;
- public UnityEvent<float> m_OnRow;
- public UnityEvent m_OnBrake;
- public int velocityOverFrames = 8;
- #endregion Inspector Fields
-
- #region Private Fields
- private Vector3 m_lastKnownOarPosition;
-
- private Queue<float> m_velocityQueue = new Queue<float>();
- #endregion Private Fields
-
- #region Getters
-
- #endregion Getters
-
-
-
- #region MonoBehaviour Functions
- /// <summary>
- /// OnEnable is called when the object becomes enabled and active.
- /// </summary>
- private void OnEnable()
- {
-
- }
-
- /// <summary>
- /// OnDisable is called when the behaviour becomes disabled.
- /// </summary>
- private void OnDisable()
- {
-
- }
-
- /// <summary>
- /// Update is called once per frame
- /// </summary>
- private void Update()
- {
-
- }
-
- #endregion MonoBehaviour Functions
-
- #region Class Functionality
-
- private void OnTriggerEnter(Collider other)
- {
- OarController oar = other.GetComponentInParent<OarController>();
- if (oar != null)
- {
- m_lastKnownOarPosition = transform.InverseTransformPoint(m_oarTip.position);
- m_velocityQueue = new Queue<float>();
- }
- }
-
- void OnTriggerStay(Collider other)
- {
- OarController oar = other.GetComponentInParent<OarController>();
- 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
- /// <summary>
- /// Called when the Component is created or Reset from the Inspector
- /// </summary>
- private void Reset()
- {
- //useful for finding components on creation
- }
- #endregion Editor Functions
-
- }
|