using UnityEngine; namespace CW.Common { /// This component allows you to freely rotate the current GameObject using local rotations. [HelpURL(CwShared.HelpUrlPrefix + "CwCameraLook")] [AddComponentMenu(CwShared.ComponentMenuPrefix + "Camera Look")] public class CwCameraLook : MonoBehaviour { /// Is this component currently listening for inputs? public bool Listen { set { listen = value; } get { return listen; } } [SerializeField] private bool listen = true; /// How quickly the rotation transitions from the current to the target value (-1 = instant). public float Damping { set { damping = value; } get { return damping; } } [SerializeField] private float damping = 10.0f; /// How quickly the mouse/finger movements rotate the camera. public float Sensitivity { set { sensitivity = value; } get { return sensitivity; } } [SerializeField] private float sensitivity = 1.0f; /// The keys/fingers required to pitch down/up. public CwInputManager.Axis PitchControls { set { pitchControls = value; } get { return pitchControls; } } [SerializeField] private CwInputManager.Axis pitchControls = new CwInputManager.Axis(1, true, CwInputManager.AxisGesture.VerticalDrag, -10.0f, KeyCode.None, KeyCode.None, KeyCode.None, KeyCode.None, 45.0f); /// The keys/fingers required to yaw left/right. public CwInputManager.Axis YawControls { set { yawControls = value; } get { return yawControls; } } [SerializeField] private CwInputManager.Axis yawControls = new CwInputManager.Axis(1, true, CwInputManager.AxisGesture.HorizontalDrag, 10.0f, KeyCode.None, KeyCode.None, KeyCode.None, KeyCode.None, 45.0f); /// The keys/fingers required to roll left/right. public CwInputManager.Axis RollControls { set { rollControls = value; } get { return rollControls; } } [SerializeField] private CwInputManager.Axis rollControls = new CwInputManager.Axis(2, true, CwInputManager.AxisGesture.Twist, 1.0f, KeyCode.E, KeyCode.Q, KeyCode.None, KeyCode.None, 45.0f); [System.NonSerialized] private Quaternion remainingDelta = Quaternion.identity; protected virtual void Start() { CwInputManager.EnsureThisComponentExists(); } protected virtual void OnDisable() { //oldMousePositionSet = false; } protected virtual void Update() { if (listen == true) { AddToDelta(); } DampenDelta(); } protected virtual void OnApplicationFocus(bool focus) { //oldMousePositionSet = false; } private void AddToDelta() { // Get delta from binds var delta = default(Vector3); delta.x = pitchControls.GetValue(Time.deltaTime); delta.y = yawControls.GetValue(Time.deltaTime); delta.z = rollControls.GetValue(Time.deltaTime); delta *= sensitivity; // Store old rotation var oldRotation = transform.localRotation; // Rotate transform.Rotate(delta.x, delta.y, 0.0f, Space.Self); transform.Rotate(0.0f, 0.0f, delta.z, Space.Self); // Add to remaining remainingDelta *= Quaternion.Inverse(oldRotation) * transform.localRotation; // Revert rotation transform.localRotation = oldRotation; } private void DampenDelta() { // Dampen remaining delta var factor = CwHelper.DampenFactor(damping, Time.deltaTime); var newDelta = Quaternion.Slerp(remainingDelta, Quaternion.identity, factor); // Rotate by difference transform.localRotation = transform.localRotation * Quaternion.Inverse(newDelta) * remainingDelta; // Update remaining remainingDelta = newDelta; } } } #if UNITY_EDITOR namespace CW.Common { using UnityEditor; using TARGET = CwCameraLook; [CanEditMultipleObjects] [CustomEditor(typeof(TARGET))] public class CwCameraLook_Editor : CwEditor { protected override void OnInspector() { TARGET tgt; TARGET[] tgts; GetTargets(out tgt, out tgts); Draw("listen", "Is this component currently listening for inputs?"); Draw("damping", "How quickly the rotation transitions from the current to the target value (-1 = instant)."); Separator(); Draw("pitchControls", "The keys/fingers required to pitch down/up."); Draw("yawControls", "The keys/fingers required to yaw left/right."); Draw("rollControls", "The keys/fingers required to roll left/right."); } } } #endif