// Rigidbody Follow|Utilities|90061
namespace VRTK
{
using UnityEngine;
///
/// Changes one game object's rigidbody to follow another game object's rigidbody.
///
[AddComponentMenu("VRTK/Scripts/Utilities/Object Follow/VRTK_RigidbodyFollow")]
public class VRTK_RigidbodyFollow : VRTK_ObjectFollow
{
///
/// Specifies how to position and rotate the rigidbody.
///
/// Use and .
/// Use and .
/// Use and .
public enum MovementOption
{
Set,
Move,
Add
}
[Tooltip("Specifies how to position and rotate the rigidbody.")]
public MovementOption movementOption = MovementOption.Set;
protected Rigidbody rigidbodyToFollow;
protected Rigidbody rigidbodyToChange;
public override void Follow()
{
CacheRigidbodies();
base.Follow();
}
protected virtual void OnDisable()
{
rigidbodyToFollow = null;
rigidbodyToChange = null;
}
protected virtual void FixedUpdate()
{
Follow();
}
protected override Vector3 GetPositionToFollow()
{
return rigidbodyToFollow.position;
}
protected override void SetPositionOnGameObject(Vector3 newPosition)
{
switch (movementOption)
{
case MovementOption.Set:
rigidbodyToChange.position = newPosition;
break;
case MovementOption.Move:
rigidbodyToChange.MovePosition(newPosition);
break;
case MovementOption.Add:
// TODO: Test if this is correct
rigidbodyToChange.AddForce(newPosition - rigidbodyToChange.position);
break;
}
}
protected override Quaternion GetRotationToFollow()
{
return rigidbodyToFollow.rotation;
}
protected override void SetRotationOnGameObject(Quaternion newRotation)
{
switch (movementOption)
{
case MovementOption.Set:
rigidbodyToChange.rotation = newRotation;
break;
case MovementOption.Move:
rigidbodyToChange.MoveRotation(newRotation);
break;
case MovementOption.Add:
// TODO: Test if this is correct
rigidbodyToChange.AddTorque(newRotation * Quaternion.Inverse(rigidbodyToChange.rotation).eulerAngles);
break;
}
}
protected override Vector3 GetScaleToFollow()
{
return rigidbodyToFollow.transform.localScale;
}
protected virtual void CacheRigidbodies()
{
if (gameObjectToFollow == null || gameObjectToChange == null
|| (rigidbodyToFollow != null && rigidbodyToChange != null))
{
return;
}
rigidbodyToFollow = gameObjectToFollow.GetComponent();
rigidbodyToChange = gameObjectToChange.GetComponent();
}
}
}