A game about forced loneliness, made by TACStudios
1using System;
2using UnityEngine.Scripting;
3
4#if UNITY_EDITOR
5using UnityEngine.InputSystem.Editor;
6using UnityEngine.UIElements;
7#endif
8
9////REVIEW: rename to RadialDeadzone
10
11////TODO: add different deadzone shapes and/or option to min/max X and Y separately
12
13namespace UnityEngine.InputSystem.Processors
14{
15 /// <summary>
16 /// Processes a Vector2 to apply deadzoning according to the magnitude of the vector (rather
17 /// than just clamping individual axes). Normalizes to the min/max range.
18 /// </summary>
19 /// <seealso cref="AxisDeadzoneProcessor"/>
20 public class StickDeadzoneProcessor : InputProcessor<Vector2>
21 {
22 /// <summary>
23 /// Value at which the lower bound deadzone starts.
24 /// </summary>
25 /// <remarks>
26 /// Values in the input at or below min will get dropped and values
27 /// will be scaled to the range between min and max.
28 /// </remarks>
29 public float min;
30 public float max;
31
32 private float minOrDefault => min == default ? InputSystem.settings.defaultDeadzoneMin : min;
33 private float maxOrDefault => max == default ? InputSystem.settings.defaultDeadzoneMax : max;
34
35 public override Vector2 Process(Vector2 value, InputControl control = null)
36 {
37 var magnitude = value.magnitude;
38 var newMagnitude = GetDeadZoneAdjustedValue(magnitude);
39 if (newMagnitude == 0)
40 value = Vector2.zero;
41 else
42 value *= newMagnitude / magnitude;
43 return value;
44 }
45
46 private float GetDeadZoneAdjustedValue(float value)
47 {
48 var min = minOrDefault;
49 var max = maxOrDefault;
50
51 var absValue = Mathf.Abs(value);
52 if (absValue < min)
53 return 0;
54 if (absValue > max)
55 return Mathf.Sign(value);
56
57 return Mathf.Sign(value) * ((absValue - min) / (max - min));
58 }
59
60 public override string ToString()
61 {
62 return $"StickDeadzone(min={minOrDefault},max={maxOrDefault})";
63 }
64 }
65
66 #if UNITY_EDITOR
67 internal class StickDeadzoneProcessorEditor : InputParameterEditor<StickDeadzoneProcessor>
68 {
69 protected override void OnEnable()
70 {
71 m_MinSetting.Initialize("Min",
72 "Vector length below which input values will be clamped. After clamping, vector lengths will be renormalized to [0..1] between min and max.",
73 "Default Deadzone Min",
74 () => target.min, v => target.min = v,
75 () => InputSystem.settings.defaultDeadzoneMin);
76 m_MaxSetting.Initialize("Max",
77 "Vector length above which input values will be clamped. After clamping, vector lengths will be renormalized to [0..1] between min and max.",
78 "Default Deadzone Max",
79 () => target.max, v => target.max = v,
80 () => InputSystem.settings.defaultDeadzoneMax);
81 }
82
83 public override void OnGUI()
84 {
85#if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS
86 if (!InputSystem.settings.IsFeatureEnabled(InputFeatureNames.kUseIMGUIEditorForAssets)) return;
87#endif
88 m_MinSetting.OnGUI();
89 m_MaxSetting.OnGUI();
90 }
91
92#if UNITY_INPUT_SYSTEM_PROJECT_WIDE_ACTIONS
93 public override void OnDrawVisualElements(VisualElement root, Action onChangedCallback)
94 {
95 m_MinSetting.OnDrawVisualElements(root, onChangedCallback);
96 m_MaxSetting.OnDrawVisualElements(root, onChangedCallback);
97 }
98
99#endif
100
101 private CustomOrDefaultSetting m_MinSetting;
102 private CustomOrDefaultSetting m_MaxSetting;
103 }
104 #endif
105}