Refactor: dedupe input reads, material-property guards, button hooks
Extract byte-identical duplicated code into shared helpers (behaviour-neutral): - New InputUtil.cs: single source for mouse-delta/scroll/cursor-lock, modifier and mouse-button reads, previously copied verbatim across camera controllers, MeshPainter, FirstPersonMode and PlayerCharacterController. - GetMatFloat/SetMatFloat replace the 12x material-instance + HasProperty guard pattern for the camo/height float properties. - Route two inline button hooks through the existing Hook() helper. Bespoke variants deliberately kept local (FreeCam SprintHeld = LeftShift only, MeshPainter.TryGetMouse with out-params). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
626dcc1bdf
commit
882d30797e
11 files changed
+158
-222
No files matched your search
@@ -1,8 +1,5 @@
|
||||
using UnityEngine;
|
||||
using Unity.Cinemachine;
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
using UnityEngine.InputSystem;
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Feeds mouse input into a <see cref="CinemachineOrbitalFollow"/> so the camera
|
||||
@@ -141,7 +138,7 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
|
||||
void OnDisable()
|
||||
{
|
||||
SetCursorLocked(false);
|
||||
InputUtil.SetCursorLocked(false);
|
||||
// Deliberately DON'T zero the pan here. The only thing that disables this component is FreeCamMode
|
||||
// taking over, and the freecam snaps to the live (still panned) view. Resetting the offset now would
|
||||
// jump the orbit camera the brain blends FROM to center while the freecam sits at the panned pose -
|
||||
@@ -209,11 +206,11 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
bool modeWantsLook = ShouldRotate();
|
||||
|
||||
if (manageCursor)
|
||||
SetCursorLocked(modeWantsLook);
|
||||
InputUtil.SetCursorLocked(modeWantsLook);
|
||||
|
||||
if (modeWantsLook && !LookSuppressed)
|
||||
{
|
||||
Vector2 delta = ReadMouseDelta() * MouseSensitivity.Multiplier;
|
||||
Vector2 delta = InputUtil.ReadMouseDelta() * MouseSensitivity.Multiplier;
|
||||
Vector2 raw = new Vector2(
|
||||
delta.x * horizontalSensitivity,
|
||||
delta.y * verticalSensitivity * (invertY ? 1f : -1f));
|
||||
@@ -250,7 +247,7 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
|
||||
// Shift/Ctrl+wheel is reserved for the paint brush resize (MeshPainter), so the orbit camera
|
||||
// ignores the wheel while either is held - otherwise it would zoom and resize at once.
|
||||
float scroll = (ShiftHeld() || CtrlHeld()) ? 0f : ReadScroll();
|
||||
float scroll = (InputUtil.ShiftHeld() || InputUtil.CtrlHeld()) ? 0f : InputUtil.ReadScroll();
|
||||
if (!Mathf.Approximately(scroll, 0f))
|
||||
{
|
||||
// One wheel notch = one zoom step (sign only), independent of the platform's raw wheel
|
||||
@@ -277,7 +274,7 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
switch (lookMode)
|
||||
{
|
||||
case OrbitLookMode.AlwaysActive: return true;
|
||||
case OrbitLookMode.HoldRightMouseButton: return IsRightMouseHeld();
|
||||
case OrbitLookMode.HoldRightMouseButton: return InputUtil.RightMouseHeld();
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
@@ -285,7 +282,7 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
void ApplyCursorState()
|
||||
{
|
||||
if (manageCursor)
|
||||
SetCursorLocked(ShouldRotate());
|
||||
InputUtil.SetCursorLocked(ShouldRotate());
|
||||
}
|
||||
|
||||
/// <summary>Adds to an input axis; wrapping axes wrap, others clamp to their range.</summary>
|
||||
@@ -311,30 +308,6 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
axis.Value = value;
|
||||
}
|
||||
|
||||
static void SetCursorLocked(bool locked)
|
||||
{
|
||||
Cursor.lockState = locked ? CursorLockMode.Locked : CursorLockMode.None;
|
||||
Cursor.visible = !locked;
|
||||
}
|
||||
|
||||
bool IsRightMouseHeld()
|
||||
{
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
return Mouse.current != null && Mouse.current.rightButton.isPressed;
|
||||
#else
|
||||
return Input.GetMouseButton(1);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool IsMiddleMouseHeld()
|
||||
{
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
return Mouse.current != null && Mouse.current.middleButton.isPressed;
|
||||
#else
|
||||
return Input.GetMouseButton(2);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>Middle-mouse pan: while PaintMode enables it, holding the middle button and dragging slides the
|
||||
/// whole framing along the screen right/up axes (via the camera-offset extension), then eases the offset
|
||||
/// back to center on release. A temporary framing offset to line up an awkward spot of the model for
|
||||
@@ -348,9 +321,9 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
bool active = PanEnabled && lookMode != OrbitLookMode.Disabled;
|
||||
float zoom = PanZoomScale();
|
||||
|
||||
if (active && IsMiddleMouseHeld())
|
||||
if (active && InputUtil.MiddleMouseHeld())
|
||||
{
|
||||
Vector2 d = ReadMouseDelta() * MouseSensitivity.Multiplier;
|
||||
Vector2 d = InputUtil.ReadMouseDelta() * MouseSensitivity.Multiplier;
|
||||
// Subtracting the drag gives a hand-tool feel (the model follows the cursor: drag right -> model
|
||||
// slides right). The step scales with the orbit distance so it feels the same on screen at every
|
||||
// zoom (finer when zoomed in). The clamp stays body-relative only (no zoom factor), so the maximum
|
||||
@@ -382,48 +355,4 @@ public class ThirdPersonOrbitInput : MonoBehaviour
|
||||
_camOffset.Offset = new Vector3(_pan.x, _pan.y, 0f);
|
||||
}
|
||||
|
||||
static bool ShiftHeld()
|
||||
{
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
var kb = Keyboard.current;
|
||||
if (kb != null) return kb.leftShiftKey.isPressed || kb.rightShiftKey.isPressed;
|
||||
#endif
|
||||
#if ENABLE_LEGACY_INPUT_MANAGER
|
||||
return Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool CtrlHeld()
|
||||
{
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
var kb = Keyboard.current;
|
||||
if (kb != null) return kb.leftCtrlKey.isPressed || kb.rightCtrlKey.isPressed;
|
||||
#endif
|
||||
#if ENABLE_LEGACY_INPUT_MANAGER
|
||||
return Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
Vector2 ReadMouseDelta()
|
||||
{
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
return Mouse.current != null ? Mouse.current.delta.ReadValue() : Vector2.zero;
|
||||
#else
|
||||
return new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")) * 10f;
|
||||
#endif
|
||||
}
|
||||
|
||||
float ReadScroll()
|
||||
{
|
||||
#if ENABLE_INPUT_SYSTEM
|
||||
// Raw wheel delta; only its sign is used (one notch = one zoom step).
|
||||
return Mouse.current != null ? Mouse.current.scroll.ReadValue().y : 0f;
|
||||
#else
|
||||
return Input.GetAxis("Mouse ScrollWheel");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user