// Controller Rigidbody Activator|Prefabs|0050
|
|
namespace VRTK
|
|
{
|
|
using UnityEngine;
|
|
|
|
/// <summary>
|
|
/// Event Payload
|
|
/// </summary>
|
|
/// <param name="interactingObject">The object that touching the activator.</param>
|
|
public struct ControllerRigidbodyActivatorEventArgs
|
|
{
|
|
public VRTK_InteractTouch touchingObject;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event Payload
|
|
/// </summary>
|
|
/// <param name="sender">this object</param>
|
|
/// <param name="e"><see cref="ControllerRigidbodyActivatorEventArgs"/></param>
|
|
public delegate void ControllerRigidbodyActivatorEventHandler(object sender, ControllerRigidbodyActivatorEventArgs e);
|
|
|
|
/// <summary>
|
|
/// Provides a simple trigger collider volume that when a controller enters will enable the rigidbody on the controller.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// **Prefab Usage:**
|
|
/// * Place the `VRTK/Prefabs/ControllerRigidbodyActivator/ControllerRigidbodyActivator` prefab in the scene at the location where the controller rigidbody should be automatically activated.
|
|
/// * The prefab contains a default sphere collider to determine ths collision, this collider component can be customised in the inspector or can be replaced with another collider component (set to `Is Trigger`).
|
|
///
|
|
/// > If the prefab is placed as a child of the target Interactable Object then the collider volume on the prefab will trigger collisions on the Interactable Object.
|
|
/// </remarks>
|
|
public class VRTK_ControllerRigidbodyActivator : MonoBehaviour
|
|
{
|
|
[Tooltip("If this is checked then the Collider will have it's Rigidbody toggled on and off during a collision.")]
|
|
public bool isEnabled = true;
|
|
[Tooltip("If this is checked then the Rigidbody Activator will activate the rigidbody and colliders on the Interact Touch script.")]
|
|
public bool activateInteractTouch = true;
|
|
[Tooltip("If this is checked then the Rigidbody Activator will activate the rigidbody and colliders on the Controller Tracked Collider script.")]
|
|
public bool activateTrackedCollider = false;
|
|
|
|
/// <summary>
|
|
/// Emitted when the controller rigidbody is turned on.
|
|
/// </summary>
|
|
public event ControllerRigidbodyActivatorEventHandler ControllerRigidbodyOn;
|
|
/// <summary>
|
|
/// Emitted when the controller rigidbody is turned off.
|
|
/// </summary>
|
|
public event ControllerRigidbodyActivatorEventHandler ControllerRigidbodyOff;
|
|
|
|
public virtual void OnControllerRigidbodyOn(ControllerRigidbodyActivatorEventArgs e)
|
|
{
|
|
if (ControllerRigidbodyOn != null)
|
|
{
|
|
ControllerRigidbodyOn(this, e);
|
|
}
|
|
}
|
|
|
|
public virtual void OnControllerRigidbodyOff(ControllerRigidbodyActivatorEventArgs e)
|
|
{
|
|
if (ControllerRigidbodyOff != null)
|
|
{
|
|
ControllerRigidbodyOff(this, e);
|
|
}
|
|
}
|
|
|
|
protected virtual void OnTriggerEnter(Collider collider)
|
|
{
|
|
ToggleRigidbody(collider, true);
|
|
}
|
|
|
|
protected virtual void OnTriggerExit(Collider collider)
|
|
{
|
|
ToggleRigidbody(collider, false);
|
|
}
|
|
|
|
protected virtual void ToggleRigidbody(Collider collider, bool state)
|
|
{
|
|
if (isEnabled || !state)
|
|
{
|
|
if (activateTrackedCollider)
|
|
{
|
|
VRTK_ControllerTrackedCollider trackedCollider = collider.GetComponentInParent<VRTK_ControllerTrackedCollider>();
|
|
if (trackedCollider != null)
|
|
{
|
|
trackedCollider.ToggleColliders(state);
|
|
EmitEvent(state, trackedCollider.interactTouch);
|
|
}
|
|
}
|
|
|
|
if (activateInteractTouch)
|
|
{
|
|
VRTK_InteractTouch touch = collider.GetComponentInParent<VRTK_InteractTouch>();
|
|
if (touch != null)
|
|
{
|
|
touch.ToggleControllerRigidBody(state, state);
|
|
EmitEvent(state, touch);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void EmitEvent(bool state, VRTK_InteractTouch touch)
|
|
{
|
|
ControllerRigidbodyActivatorEventArgs e;
|
|
e.touchingObject = touch;
|
|
if (state)
|
|
{
|
|
OnControllerRigidbodyOn(e);
|
|
}
|
|
else
|
|
{
|
|
OnControllerRigidbodyOff(e);
|
|
}
|
|
}
|
|
}
|
|
}
|