using System;
using HurricaneVR.Framework.Core.Utils;
using UnityEngine;
using UnityEngine.Events;
namespace HurricaneVR.Framework.Components
{
///
/// Basic button check for travel along a defined axis, requires the user to have setup their own constraint system.
/// Superceded by the new HVRPhysicsButton component which helps create joints and limits for you
///
[RequireComponent(typeof(Rigidbody))]
public class HVRButton : MonoBehaviour
{
public VRButtonEvent ButtonDown = new VRButtonEvent();
public VRButtonEvent ButtonUp = new VRButtonEvent();
public Vector3 Axis;
[Tooltip("How far the button must travel to become pressed.")]
public float Threshold;
[Tooltip("Threshold to hit on the return to allow the button to be pressed again.")]
public float UpThreshold;
[Tooltip("The resting position of the button")]
public Vector3 StartPosition;
public bool IsPressed = false;
public AudioClip AudioButtonDown;
public AudioClip AudioButtonUp;
public Rigidbody Rigidbody { get; private set; }
protected virtual void Awake()
{
//for older projects that wouldn't have set this in the editor
if(StartPosition == Vector3.zero)
{
StartPosition = transform.localPosition;
}
Rigidbody = GetComponent();
}
private void FixedUpdate()
{
var distance = (StartPosition - transform.localPosition).magnitude;
if (!IsPressed && distance >= Threshold)
{
IsPressed = true;
OnButtonDown();
}
else if (IsPressed && distance < UpThreshold)
{
IsPressed = false;
OnButtonUp();
}
ClampBounds();
}
private void ClampBounds()
{
var test = new Vector3(transform.localPosition.x * Axis.x, transform.localPosition.y * Axis.y, transform.localPosition.z * Axis.z);
if (test.x > StartPosition.x || test.y > StartPosition.y || test.z > StartPosition.z)
{
transform.localPosition = StartPosition;
Rigidbody.velocity = Vector3.zero;
}
}
private void LateUpdate()
{
ClampBounds();
}
protected virtual void OnButtonDown()
{
if (AudioButtonDown)
if(SFXPlayer.Instance) SFXPlayer.Instance.PlaySFX(AudioButtonDown, transform.position);
ButtonDown.Invoke(this);
}
protected virtual void OnButtonUp()
{
if (AudioButtonUp)
if(SFXPlayer.Instance) SFXPlayer.Instance.PlaySFX(AudioButtonUp, transform.position);
ButtonUp.Invoke(this);
}
}
[Serializable]
public class VRButtonEvent : UnityEvent { }
}