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}