Files
project-reset/Assets/Scripts/Player/CameraSettingsProcessor.cs

200 lines
9.9 KiB
C#

using System;
using Reset.Core;
using Sirenix.OdinInspector;
using Unity.Cinemachine;
using UnityEngine;
public struct SettingValue<T>{
public T value;
public float smoothing; // Smoothing changes how fast value is changed.
public float easing; // Easing changes how fast smoothing is changed, when given a new value.
public float currentSmoothing; // Actively eased and accessed value
public float currentValue; // Actively smoothed and accessed value
public T refVel; // For use with SmoothDamp
public SettingValue(float defaultEasing = 2f, float defaultSmoothing = 1f){
easing = defaultEasing;
value = default;
smoothing = defaultSmoothing;
currentSmoothing = 0;
currentValue = 0;
refVel = default;
}
}
public struct CameraSettingData : ICloneable{
public SettingValue<float> mainFieldOfView;
public SettingValue<Vector3> orbitPositionDamping;
public SettingValue<Vector3> orbitTargetOffset;
public SettingValue<bool> axisLookEnabledX;
public SettingValue<bool> axisLookEnabledY;
public SettingValue<float> axisLookGainX;
public SettingValue<float> axisLookGainY;
public SettingValue<float> orbitFollowTopHeight;
public SettingValue<float> orbitFollowTopRadius;
public SettingValue<float> orbitFollowCenterHeight;
public SettingValue<float> orbitFollowCenterRadius;
public SettingValue<float> orbitFollowBottomHeight;
public SettingValue<float> orbitFollowBottomRadius;
public SettingValue<Vector2> rotationComposerScreenPos;
public SettingValue<Vector3> 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<CinemachineCamera>();
orbit = mainCamera.GetComponent<CinemachineOrbitalFollow>();
rotComp = mainCamera.GetComponent<CinemachineRotationComposer>();
offset = mainCamera.GetComponent<CinemachineCameraOffset>();
axisCont = mainCamera.GetComponent<CinemachineInputAxisController>();
// 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);
}
}