From 03ff958beaef019a1ff0fa806afa0eb4f19412e6 Mon Sep 17 00:00:00 2001 From: Gregory Labute Date: Thu, 17 Jul 2025 13:10:41 -0400 Subject: [PATCH 1/2] Added InputAxisControllerBase.GetController() and InputAxisControllerBase.TriggerRecentering --- com.unity.cinemachine/CHANGELOG.md | 2 + .../Runtime/Core/InputAxis.cs | 15 ++++- .../Runtime/Core/InputAxisControllerBase.cs | 57 ++++++++++++++++++- 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/com.unity.cinemachine/CHANGELOG.md b/com.unity.cinemachine/CHANGELOG.md index 558a41efa..fc91c9780 100644 --- a/com.unity.cinemachine/CHANGELOG.md +++ b/com.unity.cinemachine/CHANGELOG.md @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - Added `CinemachineConfiner2D.CameraWasDisplaced()` and `CinemachineConfiner2D.GetCameraDisplacementDistance()` methods. +- Added `InputAxisControllerBase.GetController()` method, to conveniently fetch an Input Controller having a specific name. +- Added `InputAxisControllerBase.TriggerRecentering()` to trigger recentering of an axis having a specific name. ## [3.1.4] - 2025-06-10 diff --git a/com.unity.cinemachine/Runtime/Core/InputAxis.cs b/com.unity.cinemachine/Runtime/Core/InputAxis.cs index 82faf59f9..3d34e570e 100644 --- a/com.unity.cinemachine/Runtime/Core/InputAxis.cs +++ b/com.unity.cinemachine/Runtime/Core/InputAxis.cs @@ -303,8 +303,9 @@ public void UpdateRecentering(float deltaTime, bool forceCancel, float center) } } - /// Trigger re-centering immediately, regardless of whether re-centering - /// is enabled or the wait time has elapsed. + /// Trigger recentering immediately, regardless of whether recentering + /// is enabled or the wait time has elapsed. Note that Recentering will be automatically canceled + /// if any change to the input value is detected. public void TriggerRecentering() => m_RecenteringState.m_ForceRecenter = true; /// Cancel any current re-centering in progress, and reset the wait time @@ -398,5 +399,15 @@ public void Reset(ref InputAxis axis) m_CurrentSpeed = 0; axis.Reset(); } + + /// + /// Cancel any current input, resetting the speed to zero. This will eliminate any + /// residual acceleration or deceleration of the input value. + /// + public void CancelCurrentInput(ref InputAxis axis) + { + m_CurrentSpeed = 0; + axis.SetValueAndLastValue(axis.Value); + } } } diff --git a/com.unity.cinemachine/Runtime/Core/InputAxisControllerBase.cs b/com.unity.cinemachine/Runtime/Core/InputAxisControllerBase.cs index f29cdbcae..f4b6e9e88 100644 --- a/com.unity.cinemachine/Runtime/Core/InputAxisControllerBase.cs +++ b/com.unity.cinemachine/Runtime/Core/InputAxisControllerBase.cs @@ -195,8 +195,47 @@ public void UpdateControllers(UnityEngine.Object context, float deltaTime) c.Driver.ProcessInput(ref m_Axes[i].DrivenAxis(), c.InputValue, deltaTime); } } - } + int GetControllerIndex(string axisName) + { + for (int i = 0; i < Controllers.Count; ++i) + { + var c = Controllers[i]; + if (c.Name == axisName) + return i; + } + return -1; + } + + /// + /// Get the controller for a given axis name. The axis name is the name displayed + /// for the axis foldout on the inspector. + /// + /// The name of the axis, as it appears in the inspector. + /// The first Controller object with the matching axis name, or null if not found. + public InputAxisControllerBase.Controller GetController(string axisName) + { + int i = GetControllerIndex(axisName); + return i < 0 ? null : Controllers[i]; + } + + /// + /// Triggers recentering for a given axis, and also cancels any input currently in progrress for that axis. + /// + /// The name of the axis, as it appears in the inspector. + /// True if the axis was found and recentering triggered, false otherwise + public bool TriggerRecentering(string axisName) + { + int i = GetControllerIndex(axisName); + if (i >= 0) + { + var c = Controllers[i]; + c.Driver.CancelCurrentInput(ref m_Axes[i].DrivenAxis()); + m_Axes[i].DrivenAxis().TriggerRecentering(); + } + return i >= 0; + } + } /// /// This is a base class for a behaviour that is used to drive IInputAxisOwner behaviours, @@ -331,6 +370,22 @@ protected void UpdateControllers(float deltaTime) m_ControllerManager.UpdateControllers(this, deltaTime); } + + /// + /// Get the controller for a given axis name. The axis name is the name displayed + /// for the axis foldout on the inspector. + /// + /// The name of the axis, as it appears in the inspector. + /// The first Controller object with the matching axis name, or null if not found. + public Controller GetController(string axisName) => m_ControllerManager.GetController(axisName); + + /// + /// Triggers recentering for a given axis, and also cancels any input currently in progress for that axis. + /// This ensures that the recentering begins immediately. + /// + /// The name of the axis, as it appears in the inspector. + /// True if the axis was found and recentering triggered, false otherwise + public bool TriggerRecentering(string axisName) => m_ControllerManager.TriggerRecentering(axisName); } } From 40c6c0730e07f5902585f3f3cb5cfd2c83596fbe Mon Sep 17 00:00:00 2001 From: Gregory Labute Date: Mon, 21 Jul 2025 09:56:24 -0400 Subject: [PATCH 2/2] add missing XML doc --- com.unity.cinemachine/Runtime/Core/InputAxis.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/com.unity.cinemachine/Runtime/Core/InputAxis.cs b/com.unity.cinemachine/Runtime/Core/InputAxis.cs index 3d34e570e..c72bea31e 100644 --- a/com.unity.cinemachine/Runtime/Core/InputAxis.cs +++ b/com.unity.cinemachine/Runtime/Core/InputAxis.cs @@ -404,6 +404,7 @@ public void Reset(ref InputAxis axis) /// Cancel any current input, resetting the speed to zero. This will eliminate any /// residual acceleration or deceleration of the input value. /// + /// The axis in question public void CancelCurrentInput(ref InputAxis axis) { m_CurrentSpeed = 0;