using System.Collections.Generic;
namespace UnityEngine.XR.Content.Interaction
{
///
/// This class applies an abduction force in all rigidbodies inside the trigger collider.
/// A list is used to store all rigidbodies inside the trigger; the force is applied in
/// the FixedUpdate. The force magnitude is calculated using the pressure value of the XRPushButton
///
///
public class UfoAbductionForce : MonoBehaviour
{
[SerializeField]
[Tooltip("The minimum magnitude of the abduction force")]
float m_MinForceMagnitude;
[SerializeField]
[Tooltip("The maximum magnitude of the abduction force")]
float m_MaxForceMagnitude;
[SerializeField]
[Tooltip("All rigidbodies inside this trigger will receive the abduction force.")]
Collider m_Trigger;
float m_ButtonValue;
readonly List m_Rigidbodies = new List();
void Awake()
{
m_Trigger.enabled = false;
}
void OnEnable()
{
m_Trigger.enabled = true;
}
void OnDisable()
{
m_Trigger.enabled = false;
m_Rigidbodies.Clear();
}
void FixedUpdate()
{
var deltaForce = m_MaxForceMagnitude - m_MinForceMagnitude;
var force = transform.up * (m_MinForceMagnitude + deltaForce * m_ButtonValue);
foreach (var rigidbody in m_Rigidbodies)
rigidbody.AddForce(force, ForceMode.Acceleration);
}
void OnTriggerEnter(Collider other)
{
var otherRigidbody = other.GetComponent();
if (otherRigidbody != null)
m_Rigidbodies.Add(otherRigidbody);
}
void OnTriggerExit(Collider other)
{
var otherRigidbody = other.GetComponent();
if (otherRigidbody != null)
m_Rigidbodies.Remove(otherRigidbody);
}
///
/// Gets the current button value. Called by the XRPushButton.OnValueChange event.
///
/// The current button value
public void OnButtonValueChange(float value)
{
m_ButtonValue = value;
}
}
}