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;
public AudioClip[] m_rowClips;
#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})");
SFXPlayer.Play(m_rowClips);
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
}