diff --git a/com.unity.cinemachine/Editor/Obsolete/CinemachineFreeLookEditor.cs b/com.unity.cinemachine/Editor/Obsolete/CinemachineFreeLookEditor.cs
index 4d90f3813..8899aee61 100644
--- a/com.unity.cinemachine/Editor/Obsolete/CinemachineFreeLookEditor.cs
+++ b/com.unity.cinemachine/Editor/Obsolete/CinemachineFreeLookEditor.cs
@@ -34,6 +34,8 @@ protected override void OnEnable()
{
base.OnEnable();
Target.UpdateInputAxisProvider();
+
+ CinemachineFreeLook.CreateRigOverride += CreateRigOverride;
}
protected override void OnDisable()
@@ -172,65 +174,67 @@ void UpdateRigEditor()
}
}
- ///
- /// Register with CinemachineFreeLook to create the pipeline in an undo-friendly manner
- ///
- [InitializeOnLoad]
- class CreateRigWithUndo
+ static CinemachineVirtualCamera CreateRigOverride(CinemachineFreeLook vcam, string name, CinemachineVirtualCamera copyFrom)
{
- static CreateRigWithUndo()
+ // Recycle the game object if it exists
+ GameObject go = null;
+ foreach (Transform child in vcam.transform)
{
- CinemachineFreeLook.CreateRigOverride
- = (CinemachineFreeLook vcam, string name, CinemachineVirtualCamera copyFrom) =>
+ if (child.gameObject.name == name)
{
- // Recycle the game object if it exists
- GameObject go = null;
- foreach (Transform child in vcam.transform)
- {
- if (child.gameObject.name == name)
- {
- go = child.gameObject;
- break;
- }
- }
-
- CinemachineVirtualCamera rig = null;
- if (go == null)
- {
- // Create a new rig - can't do it if prefab instance
- if (PrefabUtility.IsPartOfAnyPrefab(vcam.gameObject))
- return null;
- go = ObjectFactory.CreateGameObject(name);
- Undo.RegisterCreatedObjectUndo(go, "created rig");
- Undo.SetTransformParent(go.transform, vcam.transform, "parenting pipeline");
- }
-
- // Create a new rig with default components
- rig = Undo.AddComponent(go);
- rig.CreatePipeline(copyFrom);
- if (copyFrom != null)
- ReflectionHelpers.CopyFields(copyFrom, rig);
- else
- {
- // Defaults
- go = rig.GetComponentOwner().gameObject;
- Undo.AddComponent(go);
- Undo.AddComponent(go);
- rig.InvalidateComponentPipeline();
- }
- return rig;
- };
-
- CinemachineFreeLook.DestroyRigOverride = (GameObject rig) =>
- {
- var vcam = rig.GetComponent();
- if (vcam != null)
- {
- vcam.DestroyPipeline();
- Undo.DestroyObjectImmediate(vcam);
- }
- };
+ go = child.gameObject;
+ break;
+ }
+ }
+
+ CinemachineVirtualCamera rig = null;
+ if (go == null)
+ {
+ // Create a new rig - can't do it if prefab instance
+ if (PrefabUtility.IsPartOfAnyPrefab(vcam.gameObject))
+ return null;
+ go = ObjectFactory.CreateGameObject(name);
+ Undo.RegisterCreatedObjectUndo(go, "created rig");
+ Undo.SetTransformParent(go.transform, vcam.transform, "parenting pipeline");
+ }
+
+ // Create a new rig with default components
+ rig = Undo.AddComponent(go);
+ rig.CreatePipeline(copyFrom);
+ if (copyFrom != null)
+ ReflectionHelpers.CopyFields(copyFrom, rig);
+ else
+ {
+ // Defaults
+ go = rig.GetComponentOwner().gameObject;
+ Undo.AddComponent(go);
+ Undo.AddComponent(go);
+ rig.InvalidateComponentPipeline();
}
+ return rig;
+ }
+
+ static void DestroyRigOverride(GameObject rig)
+ {
+ var vcam = rig.GetComponent();
+ if (vcam != null)
+ {
+ vcam.DestroyPipeline();
+ Undo.DestroyObjectImmediate(vcam);
+ }
+ }
+
+ [UnityEditor.InitializeOnLoad]
+ class EditorInitialize { static EditorInitialize() { ResetStaticsOnLoad(); } }
+
+ ///
+ /// Register with CinemachineFreeLook to create the pipeline in an undo-friendly manner
+ ///
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ CinemachineFreeLook.CreateRigOverride = CreateRigOverride;
+ CinemachineFreeLook.DestroyRigOverride = DestroyRigOverride;
}
}
}
diff --git a/com.unity.cinemachine/Editor/Obsolete/CinemachineVirtualCameraEditor.cs b/com.unity.cinemachine/Editor/Obsolete/CinemachineVirtualCameraEditor.cs
index b59f6f4a2..2fe983a15 100644
--- a/com.unity.cinemachine/Editor/Obsolete/CinemachineVirtualCameraEditor.cs
+++ b/com.unity.cinemachine/Editor/Obsolete/CinemachineVirtualCameraEditor.cs
@@ -162,66 +162,68 @@ void ResetTargetOnUndo()
(targets[i] as CinemachineVirtualCamera).InvalidateComponentPipeline();
}
- ///
- /// Register with CinemachineVirtualCamera to create the pipeline in an undo-friendly manner
- ///
- [InitializeOnLoad]
- class CreatePipelineWithUndo
+ static Transform CreatePipelineOverride(CinemachineVirtualCamera vcam, string name, CinemachineComponentBase[] copyFrom)
{
- static CreatePipelineWithUndo()
+ // Recycle existing pipeline child (if any)
+ GameObject go = null;
+ foreach (Transform child in vcam.transform)
{
- CinemachineVirtualCamera.CreatePipelineOverride =
- (CinemachineVirtualCamera vcam, string name, CinemachineComponentBase[] copyFrom) =>
+ if (child.GetComponent() != null)
{
- // Recycle existing pipeline child (if any)
- GameObject go = null;
- foreach (Transform child in vcam.transform)
- {
- if (child.GetComponent() != null)
- {
- go = child.gameObject;
- break;
- }
- }
- if (go == null)
- {
- // Create a new pipeline - can't do it if prefab instance
- if (PrefabUtility.IsPartOfAnyPrefab(vcam.gameObject))
- return null;
- go = ObjectFactory.CreateGameObject(name);
- Undo.RegisterCreatedObjectUndo(go, "created pipeline");
- Undo.SetTransformParent(go.transform, vcam.transform, "parenting pipeline");
- Undo.AddComponent(go);
- }
-
- var oldStuff = go.GetComponents();
- foreach (var c in oldStuff)
- Undo.DestroyObjectImmediate(c);
+ go = child.gameObject;
+ break;
+ }
+ }
+ if (go == null)
+ {
+ // Create a new pipeline - can't do it if prefab instance
+ if (PrefabUtility.IsPartOfAnyPrefab(vcam.gameObject))
+ return null;
+ go = ObjectFactory.CreateGameObject(name);
+ Undo.RegisterCreatedObjectUndo(go, "created pipeline");
+ Undo.SetTransformParent(go.transform, vcam.transform, "parenting pipeline");
+ Undo.AddComponent(go);
+ }
- // If copying, transfer the components
- if (copyFrom != null)
- {
- foreach (Component c in copyFrom)
- {
- Component copy = Undo.AddComponent(go, c.GetType());
- Undo.RecordObject(copy, "copying pipeline");
- ReflectionHelpers.CopyFields(c, copy);
- }
- }
- return go.transform;
- };
+ var oldStuff = go.GetComponents();
+ foreach (var c in oldStuff)
+ Undo.DestroyObjectImmediate(c);
- CinemachineVirtualCamera.DestroyPipelineOverride = (GameObject pipeline) =>
+ // If copying, transfer the components
+ if (copyFrom != null)
+ {
+ foreach (Component c in copyFrom)
{
- var oldStuff = pipeline.GetComponents();
- foreach (var c in oldStuff)
- Undo.DestroyObjectImmediate(c);
- // Cannot create or destroy child objects if prefab.
- // Just leave it there in that case, it will get discovered and recycled.
- if (!PrefabUtility.IsPartOfAnyPrefab(pipeline))
- Undo.DestroyObjectImmediate(pipeline);
- };
+ Component copy = Undo.AddComponent(go, c.GetType());
+ Undo.RecordObject(copy, "copying pipeline");
+ ReflectionHelpers.CopyFields(c, copy);
+ }
}
+ return go.transform;
+ }
+
+ static void DestroyPipelineOverride(GameObject pipeline)
+ {
+ var oldStuff = pipeline.GetComponents();
+ foreach (var c in oldStuff)
+ Undo.DestroyObjectImmediate(c);
+ // Cannot create or destroy child objects if prefab.
+ // Just leave it there in that case, it will get discovered and recycled.
+ if (!PrefabUtility.IsPartOfAnyPrefab(pipeline))
+ Undo.DestroyObjectImmediate(pipeline);
+ }
+
+ [UnityEditor.InitializeOnLoad]
+ class EditorInitialize { static EditorInitialize() { ResetStaticsOnLoad(); } }
+
+ ///
+ /// Register with CinemachineVirtualCamera to create the pipeline in an undo-friendly manner
+ ///
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ CinemachineVirtualCamera.CreatePipelineOverride = CreatePipelineOverride;
+ CinemachineVirtualCamera.DestroyPipelineOverride = DestroyPipelineOverride;
}
}
}
diff --git a/com.unity.cinemachine/Editor/Windows/CinemachineCorePrefs.cs b/com.unity.cinemachine/Editor/Windows/CinemachineCorePrefs.cs
index d3ae40184..e5bb8ff9f 100644
--- a/com.unity.cinemachine/Editor/Windows/CinemachineCorePrefs.cs
+++ b/com.unity.cinemachine/Editor/Windows/CinemachineCorePrefs.cs
@@ -21,6 +21,12 @@ protected override void WritePrefs(bool value)
CinemachineDebug.GameViewGuidesEnabled = value;
}
}
+
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ CinemachineDebug.GameViewGuidesEnabled = ShowInGameGuides.Value;
+ }
static CinemachineSettings.BoolItem s_SettingsFoldedOut = new("CNMCN_Core_Folded", true);
diff --git a/com.unity.cinemachine/Runtime/Behaviours/CinemachineDecollider.cs b/com.unity.cinemachine/Runtime/Behaviours/CinemachineDecollider.cs
index 74e6c9038..393bb558c 100644
--- a/com.unity.cinemachine/Runtime/Behaviours/CinemachineDecollider.cs
+++ b/com.unity.cinemachine/Runtime/Behaviours/CinemachineDecollider.cs
@@ -110,6 +110,16 @@ public struct TerrainSettings
static float[] s_ColliderDistanceBuffer = new float[kColliderBufferSize];
static int[] s_ColliderOrderBuffer = new int[kColliderBufferSize];
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ Array.Fill(s_ColliderBuffer, null);
+ Array.Fill(s_ColliderDistanceBuffer, 0f);
+ Array.Fill(s_ColliderOrderBuffer, 0);
+ }
+#endif
+
// Farthest stuff comes first
static readonly IComparer s_ColliderBufferSorter = Comparer.Create((a, b) =>
{
diff --git a/com.unity.cinemachine/Runtime/Behaviours/CinemachineDeoccluder.cs b/com.unity.cinemachine/Runtime/Behaviours/CinemachineDeoccluder.cs
index eff71cd37..6895edb6a 100644
--- a/com.unity.cinemachine/Runtime/Behaviours/CinemachineDeoccluder.cs
+++ b/com.unity.cinemachine/Runtime/Behaviours/CinemachineDeoccluder.cs
@@ -827,6 +827,14 @@ static float ClampRayToBounds(Ray ray, float distance, Bounds bounds)
static Collider[] s_ColliderBuffer = new Collider[5];
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ Array.Fill(s_ColliderBuffer, null);
+ }
+#endif
+
Vector3 RespectCameraRadius(Vector3 cameraPos, Vector3 lookAtPos)
{
var result = Vector3.zero;
diff --git a/com.unity.cinemachine/Runtime/Behaviours/CinemachineStoryboard.cs b/com.unity.cinemachine/Runtime/Behaviours/CinemachineStoryboard.cs
index e3cfb1012..e223a23cb 100644
--- a/com.unity.cinemachine/Runtime/Behaviours/CinemachineStoryboard.cs
+++ b/com.unity.cinemachine/Runtime/Behaviours/CinemachineStoryboard.cs
@@ -442,6 +442,12 @@ public static void AddCanvas(UnityEngine.Object canvas, UnityEngine.Object owner
s_CanvasesAndTheirOwners.Add(canvas, owner);
}
}
+
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ s_StoryboardGlobalMute = false;
+ }
#endif
}
}
diff --git a/com.unity.cinemachine/Runtime/Core/CameraState.cs b/com.unity.cinemachine/Runtime/Core/CameraState.cs
index 9463f85ce..5e986915a 100644
--- a/com.unity.cinemachine/Runtime/Core/CameraState.cs
+++ b/com.unity.cinemachine/Runtime/Core/CameraState.cs
@@ -39,7 +39,7 @@ public struct CameraState
///
/// This constant represents "no point in space" or "no direction".
///
- public static Vector3 kNoPoint = new Vector3(float.NaN, float.NaN, float.NaN);
+ public static readonly Vector3 kNoPoint = new Vector3(float.NaN, float.NaN, float.NaN);
///
/// Raw (un-corrected) world space position of this camera
diff --git a/com.unity.cinemachine/Runtime/Core/CameraUpdateManager.cs b/com.unity.cinemachine/Runtime/Core/CameraUpdateManager.cs
index 341474e49..73890c36c 100644
--- a/com.unity.cinemachine/Runtime/Core/CameraUpdateManager.cs
+++ b/com.unity.cinemachine/Runtime/Core/CameraUpdateManager.cs
@@ -222,5 +222,18 @@ public static UpdateTracker.UpdateClock GetVcamUpdateStatus(CinemachineVirtualCa
return UpdateTracker.UpdateClock.Late;
return status.lastUpdateMode;
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ s_RoundRobinIndex = 0;
+ s_RoundRobinSubIndex = 0;
+ s_LastFixedUpdateContext = null;
+ s_LastUpdateTime = 0f;
+ s_FixedFrameCount = 0;
+ s_CurrentUpdateFilter = default;
+ }
+#endif
}
}
diff --git a/com.unity.cinemachine/Runtime/Core/CinemachineBlend.cs b/com.unity.cinemachine/Runtime/Core/CinemachineBlend.cs
index 4f600e6b4..cf63db4c1 100644
--- a/com.unity.cinemachine/Runtime/Core/CinemachineBlend.cs
+++ b/com.unity.cinemachine/Runtime/Core/CinemachineBlend.cs
@@ -232,6 +232,15 @@ public CinemachineBlendDefinition(Styles style, float time)
public AnimationCurve CustomCurve;
static AnimationCurve[] s_StandardCurves;
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ s_StandardCurves = null;
+ }
+#endif
+
void CreateStandardCurves()
{
s_StandardCurves = new AnimationCurve[(int)Styles.Custom];
diff --git a/com.unity.cinemachine/Runtime/Core/CinemachineCore.cs b/com.unity.cinemachine/Runtime/Core/CinemachineCore.cs
index 6bc7eaae3..8c9b2af3a 100644
--- a/com.unity.cinemachine/Runtime/Core/CinemachineCore.cs
+++ b/com.unity.cinemachine/Runtime/Core/CinemachineCore.cs
@@ -28,12 +28,14 @@ public static class CinemachineCore
///
public const string kPackageRoot = "Packages/com.unity.cinemachine";
+ const float k_DefaultCurrentUnscaledTimeTimeOverride = -1;
+
///
/// Unit-test support:
/// If non-negative, cinemachine will use this value whenever it wants current unscaled game time.
/// Usage is for InputAxis in manual update mode, for deterministic behaviour.
///
- internal static float CurrentUnscaledTimeTimeOverride = -1;
+ internal static float CurrentUnscaledTimeTimeOverride = k_DefaultCurrentUnscaledTimeTimeOverride;
///
/// Unit-test support:
@@ -102,20 +104,24 @@ public enum BlendHints
/// The value of the axis.
public delegate float AxisInputDelegate(string axisName);
- /// Delegate for overriding Unity's default input system.
- /// If you set this, then your delegate will be called instead of
- /// System.Input.GetAxis(axisName) whenever in-game user input is needed.
#if ENABLE_LEGACY_INPUT_MANAGER
- public static AxisInputDelegate GetInputAxis = UnityEngine.Input.GetAxis;
+ static readonly AxisInputDelegate s_DefaultGetInputAxis = UnityEngine.Input.GetAxis;
#else
- public static AxisInputDelegate GetInputAxis = delegate { return 0; };
+ static readonly AxisInputDelegate s_DefaultGetInputAxis = delegate { return 0; };
#endif
+
+ /// Delegate for overriding Unity's default input system.
+ /// If you set this, then your delegate will be called instead of
+ /// System.Input.GetAxis(axisName) whenever in-game user input is needed.
+ public static AxisInputDelegate GetInputAxis = s_DefaultGetInputAxis;
+ const float k_DefaultUniformDeltaTimeOverride = -1;
+
///
/// If non-negative, cinemachine will update with this uniform delta time.
/// Usage is for timelines in manual update mode.
///
- public static float UniformDeltaTimeOverride = -1;
+ public static float UniformDeltaTimeOverride = k_DefaultUniformDeltaTimeOverride;
///
/// Replacement for Time.deltaTime, taking UniformDeltaTimeOverride into account.
@@ -123,17 +129,21 @@ public enum BlendHints
public static float DeltaTime
=> UniformDeltaTimeOverride >= 0 ? UniformDeltaTimeOverride : Time.deltaTime;
+ const float k_DefaultCurrentTimeOverride = -1;
+
///
/// If non-negative, cinemachine will use this value whenever it wants current game time.
/// Usage is for master timelines in manual update mode, for deterministic behaviour.
///
- public static float CurrentTimeOverride = -1;
+ public static float CurrentTimeOverride = k_DefaultCurrentTimeOverride;
///
/// Replacement for Time.time, taking CurrentTimeTimeOverride into account.
///
public static float CurrentTime => CurrentTimeOverride >= 0 ? CurrentTimeOverride : Time.time;
+ const int k_DefaultCurrentUpdateFrame = 0;
+
///
/// The current frame
/// By default this is Time.frameCount. If you are using ManualUpdate with a custom update frame,
@@ -368,5 +378,26 @@ public static void ResetCameraState()
for (int i = 0; i < numBrains; ++i)
CinemachineBrain.GetActiveBrain(i).ResetState();
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ CurrentUnscaledTimeTimeOverride = k_DefaultCurrentUnscaledTimeTimeOverride;
+ UnitTestMode = false;
+ UniformDeltaTimeOverride = k_DefaultUniformDeltaTimeOverride;
+ CurrentTimeOverride = k_DefaultCurrentTimeOverride;
+ CurrentUpdateFrame = k_DefaultCurrentUpdateFrame;
+ GetInputAxis = s_DefaultGetInputAxis;
+ GetBlendOverride = null;
+ GetCustomBlender = null;
+ //CameraUpdatedEvent = new();
+ //CameraActivatedEvent = new();
+ CameraDeactivatedEvent = new();
+ BlendCreatedEvent = new();
+ BlendFinishedEvent = new();
+ s_SoloCamera = null;
+ }
+#endif
}
-}
+}
\ No newline at end of file
diff --git a/com.unity.cinemachine/Runtime/Core/Predictor.cs b/com.unity.cinemachine/Runtime/Core/Predictor.cs
index 9be08e149..be6f8fffb 100644
--- a/com.unity.cinemachine/Runtime/Core/Predictor.cs
+++ b/com.unity.cinemachine/Runtime/Core/Predictor.cs
@@ -1,3 +1,4 @@
+using System;
using UnityEngine;
using UnityEngine.SceneManagement;
@@ -295,6 +296,20 @@ internal static void SetDampTimeScale(float fps)
// Valid only for kSubframeTime = 1.0f / 1024.0f
DampTimeScale = 2.0f - 1.81e-3f * fps + 7.9e-07f * fps * fps;
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ Array.Fill(s_Buffer, 0f);
+ s_NumItems = 0;
+ s_Head = 0;
+ s_Sum = 0;
+
+ FPS = 0f;
+ DampTimeScale = 0f;
+ }
+#endif
}
}
}
diff --git a/com.unity.cinemachine/Runtime/Core/RuntimeUtility.cs b/com.unity.cinemachine/Runtime/Core/RuntimeUtility.cs
index fc8ecc7d3..f02064253 100644
--- a/com.unity.cinemachine/Runtime/Core/RuntimeUtility.cs
+++ b/com.unity.cinemachine/Runtime/Core/RuntimeUtility.cs
@@ -1,3 +1,4 @@
+using System;
using UnityEngine;
namespace Unity.Cinemachine
@@ -222,8 +223,21 @@ public static void DestroyScratchCollider()
s_ScratchCollider = null;
}
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ Array.Fill(s_HitBuffer, default);
+ Array.Fill(s_PenetrationIndexBuffer, 0);
+ s_ScratchCollider = null;
+ s_ScratchColliderGameObject = null;
+ s_ScratchColliderRefCount = 0;
+ }
#endif
+#endif // CINEMACHINE_PHYSICS
+
///
/// Normalize a curve so that its X and Y axes range from 0 to 1
///
diff --git a/com.unity.cinemachine/Runtime/Core/TargetPositionCache.cs b/com.unity.cinemachine/Runtime/Core/TargetPositionCache.cs
index 5f610fd46..a2af6ec88 100644
--- a/com.unity.cinemachine/Runtime/Core/TargetPositionCache.cs
+++ b/com.unity.cinemachine/Runtime/Core/TargetPositionCache.cs
@@ -308,5 +308,19 @@ public static Quaternion GetTargetRotation(Transform target)
}
return entry.Curve.Evaluate(CurrentTime).Rot;
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ UseCache = false;
+ m_CacheMode = Mode.Disabled;
+ CurrentTime = 0f;
+ CurrentFrame = 0;
+ IsCameraCut = false;
+ m_Cache = null;
+ m_CacheTimeRange = default;
+ }
+#endif
}
}
diff --git a/com.unity.cinemachine/Runtime/Core/UpdateTracker.cs b/com.unity.cinemachine/Runtime/Core/UpdateTracker.cs
index 8f24d262f..bc1bf2b9c 100644
--- a/com.unity.cinemachine/Runtime/Core/UpdateTracker.cs
+++ b/com.unity.cinemachine/Runtime/Core/UpdateTracker.cs
@@ -129,5 +129,14 @@ public static void ForgetContext(object context)
if (s_LastUpdateContext == context)
s_LastUpdateContext = null;
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ s_ToDelete.Clear();
+ s_LastUpdateContext = null;
+ }
+#endif
}
}
diff --git a/com.unity.cinemachine/Runtime/Debug/CinemachineDebug.cs b/com.unity.cinemachine/Runtime/Debug/CinemachineDebug.cs
index ad2b1e7b5..c3de36d9b 100644
--- a/com.unity.cinemachine/Runtime/Debug/CinemachineDebug.cs
+++ b/com.unity.cinemachine/Runtime/Debug/CinemachineDebug.cs
@@ -126,7 +126,7 @@ static void PositionWithinCameraView(VisualElement viewportContainer, Camera cam
///
/// Tracks CinemachineCorePrefs.ShowInGameGuides.Value, so it can be accessed at runtime
///
- public static bool GameViewGuidesEnabled;
+ public static bool GameViewGuidesEnabled = false;
/// Get a pre-allocated StringBuilder from the pool
/// The pre-allocated StringBuilder from the pool.
@@ -148,5 +148,15 @@ public static void ReturnToPool(StringBuilder sb)
s_AvailableStringBuilders ??= new List();
s_AvailableStringBuilders.Add(sb);
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ s_AvailableStringBuilders = null;
+ OnGUIHandlers = null;
+ GameViewGuidesEnabled = false;
+ }
+#endif
}
}
diff --git a/com.unity.cinemachine/Runtime/Deprecated/CinemachineCollider.cs b/com.unity.cinemachine/Runtime/Deprecated/CinemachineCollider.cs
index a732f8588..676aeafe7 100644
--- a/com.unity.cinemachine/Runtime/Deprecated/CinemachineCollider.cs
+++ b/com.unity.cinemachine/Runtime/Deprecated/CinemachineCollider.cs
@@ -126,7 +126,17 @@ public enum ResolutionStrategy
[Tooltip("If greater than zero, a higher score will be given to shots when the target is closer to this distance. "
+ "Set this to zero to disable this feature.")]
public float m_OptimalTargetDistance;
+
+ static Collider[] s_ColliderBuffer = new Collider[5];
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ Array.Fill(s_ColliderBuffer, null);
+ }
+#endif
+
/// See whether an object is blocking the camera's view of the target
/// The virtual camera in question. This might be different from the
/// virtual camera that owns the collider, in the event that the camera has children
@@ -659,9 +669,7 @@ static float ClampRayToBounds(Ray ray, float distance, Bounds bounds)
}
return distance;
}
-
- static Collider[] s_ColliderBuffer = new Collider[5];
-
+
Vector3 RespectCameraRadius(Vector3 cameraPos, Vector3 lookAtPos)
{
Vector3 result = Vector3.zero;
diff --git a/com.unity.cinemachine/Runtime/Deprecated/CinemachineFreeLook.cs b/com.unity.cinemachine/Runtime/Deprecated/CinemachineFreeLook.cs
index 83ae3133f..8d0ecc96f 100644
--- a/com.unity.cinemachine/Runtime/Deprecated/CinemachineFreeLook.cs
+++ b/com.unity.cinemachine/Runtime/Deprecated/CinemachineFreeLook.cs
@@ -941,6 +941,15 @@ void UpdateCachedSpline()
m_CachedTension = m_SplineCurvature;
}
}
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ //CreateRigOverride = null;
+ //DestroyRigOverride = null;
+ }
+#endif
}
}
#endif
diff --git a/com.unity.cinemachine/Runtime/Deprecated/CinemachineOrbitalTransposer.cs b/com.unity.cinemachine/Runtime/Deprecated/CinemachineOrbitalTransposer.cs
index 6c957c533..1b0851244 100644
--- a/com.unity.cinemachine/Runtime/Deprecated/CinemachineOrbitalTransposer.cs
+++ b/com.unity.cinemachine/Runtime/Deprecated/CinemachineOrbitalTransposer.cs
@@ -49,8 +49,8 @@ void ClearHistory()
mHeadingSum = Vector3.zero;
}
- static float mDecayExponent;
- static float Decay(float time) { return Mathf.Exp(time * mDecayExponent); }
+ float mDecayExponent;
+ float Decay(float time) { return Mathf.Exp(time * mDecayExponent); }
/// Add a new velocity frame. This should be called once per frame,
/// unless the velocity is zero
diff --git a/com.unity.cinemachine/Runtime/Deprecated/CinemachineVirtualCamera.cs b/com.unity.cinemachine/Runtime/Deprecated/CinemachineVirtualCamera.cs
index e25e8f5b7..6e98dd2bd 100644
--- a/com.unity.cinemachine/Runtime/Deprecated/CinemachineVirtualCamera.cs
+++ b/com.unity.cinemachine/Runtime/Deprecated/CinemachineVirtualCamera.cs
@@ -208,6 +208,15 @@ protected void OnValidate()
m_Lens.Validate();
}
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ //CreatePipelineOverride = null;
+ //DestroyPipelineOverride = null;
+ }
+#endif
+
void OnTransformChildrenChanged()
{
InvalidateComponentPipeline();
diff --git a/com.unity.cinemachine/Runtime/Helpers/CinemachineInputAxisController.cs b/com.unity.cinemachine/Runtime/Helpers/CinemachineInputAxisController.cs
index e6af44ca3..ba04553c6 100644
--- a/com.unity.cinemachine/Runtime/Helpers/CinemachineInputAxisController.cs
+++ b/com.unity.cinemachine/Runtime/Helpers/CinemachineInputAxisController.cs
@@ -48,6 +48,14 @@ internal delegate void SetControlDefaultsForAxis(
in IInputAxisOwner.AxisDescriptor axis, ref Controller controller);
internal static SetControlDefaultsForAxis SetControlDefaults;
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ SetControlDefaults = null;
+ }
+#endif
+
#if CINEMACHINE_UNITY_INPUTSYSTEM
///
/// CinemachineInputAxisController.Reader can only handle float or Vector2 InputAction types.
diff --git a/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseDefinition.cs b/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseDefinition.cs
index 2f6706987..3f1f02578 100644
--- a/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseDefinition.cs
+++ b/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseDefinition.cs
@@ -222,6 +222,15 @@ public void OnValidate()
}
static AnimationCurve[] s_StandardShapes;
+
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ s_StandardShapes = null;
+ }
+#endif
+
static void CreateStandardShapes()
{
int max = 0;
diff --git a/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseManager.cs b/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseManager.cs
index dc01f1daa..a54473355 100644
--- a/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseManager.cs
+++ b/com.unity.cinemachine/Runtime/Impulse/CinemachineImpulseManager.cs
@@ -31,12 +31,20 @@ public static CinemachineImpulseManager Instance
}
}
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ static void ResetStaticsOnLoad()
+ {
+ s_Instance = null;
+ }
+#else
[RuntimeInitializeOnLoadMethod]
static void InitializeModule()
{
if (s_Instance != null)
s_Instance.Clear();
}
+#endif
const float Epsilon = UnityVectorExtensions.Epsilon;
diff --git a/com.unity.cinemachine/Runtime/PostProcessing/CinemachineVolumeSettings.cs b/com.unity.cinemachine/Runtime/PostProcessing/CinemachineVolumeSettings.cs
index 5994cc795..b12652bc6 100644
--- a/com.unity.cinemachine/Runtime/PostProcessing/CinemachineVolumeSettings.cs
+++ b/com.unity.cinemachine/Runtime/PostProcessing/CinemachineVolumeSettings.cs
@@ -31,12 +31,14 @@ namespace Unity.Cinemachine
[HelpURL(Documentation.BaseURL + "manual/CinemachineVolumeSettings.html")]
public class CinemachineVolumeSettings : CinemachineExtension
{
+ private const float k_DefaultVolumePriority = 1000f;
+
///
/// This is the priority for the vcam's PostProcessing volumes. It's set to a high
/// number in order to ensure that it overrides other volumes for the active vcam.
/// You can change this value if necessary to work with other systems.
///
- public static float s_VolumePriority = 1000f;
+ public static float s_VolumePriority = k_DefaultVolumePriority;
///
/// This is the weight that the PostProcessing profile will have when the camera is fully active.
@@ -358,6 +360,14 @@ static void InitializeModule()
CinemachineCore.CameraActivatedEvent.RemoveListener(OnCameraCut);
CinemachineCore.CameraActivatedEvent.AddListener(OnCameraCut);
}
+
+ [RuntimeInitializeOnLoadMethod]
+ static void ResetStaticsOnLoad()
+ {
+ s_VolumePriority = k_DefaultVolumePriority;
+ sVolumes = new();
+ }
+
}
}
#endif
diff --git a/com.unity.cinemachine/Runtime/ThirdParty/clipper.cs b/com.unity.cinemachine/Runtime/ThirdParty/clipper.cs
index 3c0f9ab71..00a47f385 100644
--- a/com.unity.cinemachine/Runtime/ThirdParty/clipper.cs
+++ b/com.unity.cinemachine/Runtime/ThirdParty/clipper.cs
@@ -31,10 +31,10 @@ namespace Unity.Cinemachine
static class Clipper
{
- public static Rect64 MaxInvalidRect64 = new Rect64(
+ public static readonly Rect64 MaxInvalidRect64 = new Rect64(
long.MaxValue, long.MaxValue, long.MinValue, long.MinValue);
- public static RectD MaxInvalidRectD = new RectD(
+ public static readonly RectD MaxInvalidRectD = new RectD(
double.MaxValue, -double.MaxValue, -double.MaxValue, -double.MaxValue);
public static Paths64 Intersect(Paths64 subject, Paths64 clip, FillRule fillRule)
diff --git a/com.unity.cinemachine/Runtime/Timeline/CinemachinePlayableMixer.cs b/com.unity.cinemachine/Runtime/Timeline/CinemachinePlayableMixer.cs
index e0d51df82..41f5359ee 100644
--- a/com.unity.cinemachine/Runtime/Timeline/CinemachinePlayableMixer.cs
+++ b/com.unity.cinemachine/Runtime/Timeline/CinemachinePlayableMixer.cs
@@ -14,6 +14,14 @@ internal sealed class CinemachinePlayableMixer : PlayableBehaviour
public delegate PlayableDirector MasterDirectorDelegate();
public static MasterDirectorDelegate GetMasterPlayableDirector;
+#if UNITY_EDITOR
+ [RuntimeInitializeOnLoadMethod]
+ private static void ResetStaticsOnLoad()
+ {
+ GetMasterPlayableDirector = null;
+ }
+#endif
+
// The brain that this track controls
ICameraOverrideStack m_BrainOverrideStack;
int m_BrainOverrideId = -1;