using System; using Reset.Core; using Sirenix.OdinInspector; using Unity.Cinemachine; using UnityEngine; public struct CameraSettingData : ICloneable{ public SettingValue mainFieldOfView; public SettingValue orbitPositionDamping; public SettingValue orbitTargetOffset; public SettingValue axisLookEnabledX; public SettingValue axisLookEnabledY; public SettingValue axisLookGainX; public SettingValue axisLookGainY; public SettingValue orbitFollowTopHeight; public SettingValue orbitFollowTopRadius; public SettingValue orbitFollowCenterHeight; public SettingValue orbitFollowCenterRadius; public SettingValue orbitFollowBottomHeight; public SettingValue orbitFollowBottomRadius; public SettingValue rotationComposerScreenPos; public SettingValue cameraOffsetOffset; public object Clone(){ return MemberwiseClone(); } } public class CameraSettingsProcessor : MonoBehaviour{ public static CameraSettingsProcessor Instance{ get; private set; } [HideInInspector] public static CameraSettingData data; [HideInInspector] public static CameraSettingData original; [ShowInInspector] public static CameraSettingData smoothing; [ShowInInspector] public static CameraSettingData easing; [HideInInspector] public static CameraSettingData currentSmoothing; [HideInInspector] public static CameraSettingData currentValue; public static GameObject mainCamera; private CinemachineCamera main; private CinemachineOrbitalFollow orbit; private CinemachineRotationComposer rotComp; private CinemachineCameraOffset offset; private CinemachineInputAxisController axisCont; public void Awake(){ // Singleton management if (Instance != null && Instance != this) { Destroy(this); } else { Instance = this; } // Set references for camera object and cinemachine components mainCamera = gameObject; main = mainCamera.GetComponent(); orbit = mainCamera.GetComponent(); rotComp = mainCamera.GetComponent(); offset = mainCamera.GetComponent(); axisCont = mainCamera.GetComponent(); // Initialize camera settings values from current values data.mainFieldOfView.value = main.Lens.FieldOfView; data.orbitPositionDamping.value = orbit.TrackerSettings.PositionDamping; data.orbitTargetOffset.value = orbit.TargetOffset; data.axisLookEnabledX.value = axisCont.Controllers[0].Enabled; data.axisLookEnabledY.value = axisCont.Controllers[1].Enabled; data.axisLookGainX.value = axisCont.Controllers[0].Input.Gain; data.axisLookGainY.value = axisCont.Controllers[1].Input.Gain; data.orbitFollowTopHeight.value = orbit.Orbits.Top.Height; data.orbitFollowTopRadius.value = orbit.Orbits.Top.Radius; data.orbitFollowCenterHeight.value = orbit.Orbits.Center.Height; data.orbitFollowCenterRadius.value = orbit.Orbits.Center.Radius; data.orbitFollowBottomHeight.value = orbit.Orbits.Bottom.Height; data.orbitFollowBottomRadius.value = orbit.Orbits.Bottom.Radius; data.rotationComposerScreenPos.value = rotComp.Composition.ScreenPosition; data.cameraOffsetOffset.value = offset.Offset; // And copy to the original original = (CameraSettingData)data.Clone(); } void Update(){ EaseToNewSmoothingValues(); ProcessCameraValues(); } void EaseToNewSmoothingValues(){ data.mainFieldOfView.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, data.mainFieldOfView.easing * Time.deltaTime); data.orbitPositionDamping.currentSmoothing = Mathf.MoveTowards(data.orbitPositionDamping.currentSmoothing, data.orbitPositionDamping.smoothing, easing.orbitPositionDamping.easing * Time.deltaTime); data.orbitTargetOffset.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.axisLookGainX.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.axisLookGainY.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.orbitFollowTopHeight.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.orbitFollowTopRadius.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.orbitFollowCenterHeight.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.orbitFollowCenterRadius.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.orbitFollowBottomHeight.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.orbitFollowBottomRadius.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.rotationComposerScreenPos.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); data.cameraOffsetOffset.currentSmoothing = Mathf.MoveTowards(data.mainFieldOfView.currentSmoothing, data.mainFieldOfView.smoothing, easing.mainFieldOfView.easing * Time.deltaTime); } void ProcessCameraValues(){ main.Lens.FieldOfView = Mathf.SmoothDamp(main.Lens.FieldOfView, data.mainFieldOfView.value, ref data.mainFieldOfView.refVel, data.mainFieldOfView.smoothing); axisCont.Controllers[0].Enabled = data.axisLookEnabledX.value; axisCont.Controllers[1].Enabled = data.axisLookEnabledY.value; axisCont.Controllers[0].Input.Gain = Mathf.SmoothDamp(axisCont.Controllers[0].Input.Gain, data.axisLookGainX.value, ref data.axisLookGainX.refVel, data.axisLookGainX.smoothing); axisCont.Controllers[1].Input.Gain = Mathf.SmoothDamp(axisCont.Controllers[1].Input.Gain, data.axisLookGainY.value, ref data.axisLookGainY.refVel, data.axisLookGainY.smoothing); orbit.TargetOffset = Vector3.SmoothDamp(orbit.TargetOffset, data.orbitTargetOffset.value, ref data.orbitTargetOffset.refVel, data.orbitTargetOffset.smoothing); orbit.TrackerSettings.PositionDamping = Vector3.SmoothDamp(orbit.TrackerSettings.PositionDamping, data.orbitPositionDamping.value, ref data.orbitPositionDamping.refVel, data.orbitPositionDamping.smoothing); orbit.Orbits.Top.Height = Mathf.SmoothDamp(orbit.Orbits.Top.Height, data.orbitFollowTopHeight.value, ref data.orbitFollowTopHeight.refVel, data.orbitFollowTopHeight.smoothing); orbit.Orbits.Top.Radius = Mathf.SmoothDamp(orbit.Orbits.Top.Radius, data.orbitFollowTopRadius.value, ref data.orbitFollowTopRadius.refVel, data.orbitFollowTopRadius.smoothing); orbit.Orbits.Center.Height = Mathf.SmoothDamp(orbit.Orbits.Center.Height, data.orbitFollowCenterHeight.value, ref data.orbitFollowCenterHeight.refVel, data.orbitFollowCenterHeight.smoothing); orbit.Orbits.Center.Radius = Mathf.SmoothDamp(orbit.Orbits.Center.Radius, data.orbitFollowCenterRadius.value, ref data.orbitFollowCenterRadius.refVel, data.orbitFollowCenterRadius.smoothing); orbit.Orbits.Bottom.Height = Mathf.SmoothDamp(orbit.Orbits.Bottom.Height, data.orbitFollowBottomHeight.value, ref data.orbitFollowBottomHeight.refVel, data.orbitFollowBottomHeight.smoothing); orbit.Orbits.Bottom.Radius = Mathf.SmoothDamp(orbit.Orbits.Bottom.Radius, data.orbitFollowBottomRadius.value, ref data.orbitFollowBottomRadius.refVel, data.orbitFollowBottomRadius.smoothing); rotComp.Composition.ScreenPosition = Vector2.SmoothDamp(rotComp.Composition.ScreenPosition, data.rotationComposerScreenPos.value, ref data.rotationComposerScreenPos.refVel, data.rotationComposerScreenPos.smoothing); offset.Offset = Vector3.SmoothDamp(offset.Offset, data.cameraOffsetOffset.value, ref data.cameraOffsetOffset.refVel, data.cameraOffsetOffset.smoothing); } }