using UnityEngine; using UnityEngine.Serialization; namespace Cinemachine { /// <summary> /// This is a very simple behaviour that constrains its transform to a CinemachinePath. /// It can be used to animate any objects along a path, or as a Follow target for /// Cinemachine Virtual Cameras. /// </summary> [DocumentationSorting(DocumentationSortingAttribute.Level.UserRef)] [ExecuteAlways] [DisallowMultipleComponent] [HelpURL(Documentation.BaseURL + "manual/CinemachineDollyCart.html")] public class CinemachineDollyCart : MonoBehaviour { /// <summary>The path to follow</summary> [Tooltip("The path to follow")] public CinemachinePathBase m_Path; /// <summary>This enum defines the options available for the update method.</summary> public enum UpdateMethod { /// <summary>Updated in normal MonoBehaviour Update.</summary> Update, /// <summary>Updated in sync with the Physics module, in FixedUpdate</summary> FixedUpdate, /// <summary>Updated in normal MonoBehaviour LateUpdate</summary> LateUpdate }; /// <summary>When to move the cart, if Velocity is non-zero</summary> [Tooltip("When to move the cart, if Velocity is non-zero")] public UpdateMethod m_UpdateMethod = UpdateMethod.Update; /// <summary>How to interpret the Path Position</summary> [Tooltip("How to interpret the Path Position. If set to Path Units, values are as follows: 0 represents the first waypoint on the path, 1 is the second, and so on. Values in-between are points on the path in between the waypoints. If set to Distance, then Path Position represents distance along the path.")] public CinemachinePathBase.PositionUnits m_PositionUnits = CinemachinePathBase.PositionUnits.Distance; /// <summary>Move the cart with this speed</summary> [Tooltip("Move the cart with this speed along the path. The value is interpreted according to the Position Units setting.")] [FormerlySerializedAs("m_Velocity")] public float m_Speed; /// <summary>The cart's current position on the path, in distance units</summary> [Tooltip("The position along the path at which the cart will be placed. This can be animated directly or, if the velocity is non-zero, will be updated automatically. The value is interpreted according to the Position Units setting.")] [FormerlySerializedAs("m_CurrentDistance")] public float m_Position; void FixedUpdate() { if (m_UpdateMethod == UpdateMethod.FixedUpdate) SetCartPosition(m_Position + m_Speed * Time.deltaTime); } void Update() { float speed = Application.isPlaying ? m_Speed : 0; if (m_UpdateMethod == UpdateMethod.Update) SetCartPosition(m_Position + speed * Time.deltaTime); } void LateUpdate() { if (!Application.isPlaying) SetCartPosition(m_Position); else if (m_UpdateMethod == UpdateMethod.LateUpdate) SetCartPosition(m_Position + m_Speed * Time.deltaTime); } void SetCartPosition(float distanceAlongPath) { if (m_Path != null) { m_Position = m_Path.StandardizeUnit(distanceAlongPath, m_PositionUnits); transform.position = m_Path.EvaluatePositionAtUnit(m_Position, m_PositionUnits); transform.rotation = m_Path.EvaluateOrientationAtUnit(m_Position, m_PositionUnits); } } } }