| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- using UnityEngine;
- using Cinemachine;
- /// <summary>
- /// An add-on module for Cinemachine Virtual Camera that adds a final tweak to the camera
- /// comnposition. It is intended for use in a Timeline context, where you want to hand-adjust
- /// the output of procedural or recorded camera aiming.
- /// </summary>
- [AddComponentMenu("")] // Hide in menu
- [ExecuteAlways]
- [SaveDuringPlay]
- [HelpURL(Documentation.BaseURL + "manual/CinemachineRecomposer.html")]
- public class CinemachineRecomposer : CinemachineExtension
- {
- /// <summary>
- /// When to apply the adjustment
- /// </summary>
- [Tooltip("When to apply the adjustment")]
- public CinemachineCore.Stage m_ApplyAfter;
- /// <summary>
- /// Tilt the camera by this much
- /// </summary>
- [Tooltip("Tilt the camera by this much")]
- public float m_Tilt;
- /// <summary>
- /// Pan the camera by this much
- /// </summary>
- [Tooltip("Pan the camera by this much")]
- public float m_Pan;
- /// <summary>
- /// Roll the camera by this much
- /// </summary>
- [Tooltip("Roll the camera by this much")]
- public float m_Dutch;
- /// <summary>
- /// Scale the zoom by this amount (normal = 1)
- /// </summary>
- [Tooltip("Scale the zoom by this amount (normal = 1)")]
- public float m_ZoomScale;
- /// <summary>
- /// Lowering this value relaxes the camera's attention to the Follow target (normal = 1)
- /// </summary>
- [Range(0, 1)]
- [Tooltip("Lowering this value relaxes the camera's attention to the Follow target (normal = 1)")]
- public float m_FollowAttachment;
- /// <summary>
- /// Lowering this value relaxes the camera's attention to the LookAt target (normal = 1)
- /// </summary>
- [Range(0, 1)]
- [Tooltip("Lowering this value relaxes the camera's attention to the LookAt target (normal = 1)")]
- public float m_LookAtAttachment;
- private void Reset()
- {
- m_ApplyAfter = CinemachineCore.Stage.Finalize;
- m_Tilt = 0;
- m_Pan = 0;
- m_Dutch = 0;
- m_ZoomScale = 1;
- m_FollowAttachment = 1;
- m_LookAtAttachment = 1;
- }
- private void OnValidate()
- {
- m_ZoomScale = Mathf.Max(0.01f, m_ZoomScale);
- m_FollowAttachment = Mathf.Clamp01(m_FollowAttachment);
- m_LookAtAttachment = Mathf.Clamp01(m_LookAtAttachment);
- }
- /// <summary>Callback to set the target attachment</summary>
- /// <param name="vcam">The virtual camera being processed</param>
- /// <param name="curState">Input state that must be mutated</param>
- /// <param name="deltaTime">The current applicable deltaTime</param>
- public override void PrePipelineMutateCameraStateCallback(
- CinemachineVirtualCameraBase vcam, ref CameraState curState, float deltaTime)
- {
- vcam.FollowTargetAttachment = m_FollowAttachment;
- vcam.LookAtTargetAttachment = m_LookAtAttachment;
- }
- /// <summary>Callback to tweak the settings</summary>
- /// <param name="vcam">The virtual camera being processed</param>
- /// <param name="stage">The current pipeline stage</param>
- /// <param name="state">The current virtual camera state</param>
- /// <param name="deltaTime">The current applicable deltaTime</param>
- protected override void PostPipelineStageCallback(
- CinemachineVirtualCameraBase vcam,
- CinemachineCore.Stage stage, ref CameraState state, float deltaTime)
- {
- if (stage == m_ApplyAfter)
- {
- var lens = state.Lens;
- // Tilt by local X
- var qTilted = state.RawOrientation * Quaternion.AngleAxis(m_Tilt, Vector3.right);
- // Pan in world space
- var qDesired = Quaternion.AngleAxis(m_Pan, state.ReferenceUp) * qTilted;
- state.OrientationCorrection = Quaternion.Inverse(state.CorrectedOrientation) * qDesired;
- // And dutch at the end
- lens.Dutch += m_Dutch;
- // Finally zoom
- if (m_ZoomScale != 1)
- {
- lens.OrthographicSize *= m_ZoomScale;
- lens.FieldOfView *= m_ZoomScale;
- }
- state.Lens = lens;
- }
- }
- }
|