| using System; |
| using UnityEngine.InputSystem.Layouts; |
| using UnityEngine.InputSystem.LowLevel; |
|
|
| namespace UnityEngine.InputSystem.Controls |
| { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public class DpadControl : Vector2Control |
| { |
| [InputControlLayout(hideInUI = true)] |
| public class DpadAxisControl : AxisControl |
| { |
| public int component { get; set; } |
|
|
| protected override void FinishSetup() |
| { |
| base.FinishSetup(); |
| component = name == "x" ? 0 : 1; |
|
|
| |
| |
| |
| m_StateBlock = m_Parent.m_StateBlock; |
| } |
|
|
| public override unsafe float ReadUnprocessedValueFromState(void* statePtr) |
| { |
| var value = ((DpadControl)m_Parent).ReadUnprocessedValueFromState(statePtr); |
| return value[component]; |
| } |
| } |
|
|
| |
| |
| |
| [InputControl(name = "x", layout = "DpadAxis", useStateFrom = "right", synthetic = true)] |
| [InputControl(name = "y", layout = "DpadAxis", useStateFrom = "up", synthetic = true)] |
|
|
| |
| |
| |
| [InputControl(bit = (int)ButtonBits.Up, displayName = "Up")] |
| public ButtonControl up { get; set; } |
|
|
| |
| |
| |
| [InputControl(bit = (int)ButtonBits.Down, displayName = "Down")] |
| public ButtonControl down { get; set; } |
|
|
| |
| |
| |
| [InputControl(bit = (int)ButtonBits.Left, displayName = "Left")] |
| public ButtonControl left { get; set; } |
|
|
| |
| |
| |
| [InputControl(bit = (int)ButtonBits.Right, displayName = "Right")] |
| public ButtonControl right { get; set; } |
|
|
| |
|
|
| public DpadControl() |
| { |
| m_StateBlock.sizeInBits = 4; |
| m_StateBlock.format = InputStateBlock.FormatBit; |
| } |
|
|
| protected override void FinishSetup() |
| { |
| up = GetChildControl<ButtonControl>("up"); |
| down = GetChildControl<ButtonControl>("down"); |
| left = GetChildControl<ButtonControl>("left"); |
| right = GetChildControl<ButtonControl>("right"); |
| base.FinishSetup(); |
| } |
|
|
| public override unsafe Vector2 ReadUnprocessedValueFromState(void* statePtr) |
| { |
| var upIsPressed = up.ReadValueFromStateWithCaching(statePtr) >= up.pressPointOrDefault; |
| var downIsPressed = down.ReadValueFromStateWithCaching(statePtr) >= down.pressPointOrDefault; |
| var leftIsPressed = left.ReadValueFromStateWithCaching(statePtr) >= left.pressPointOrDefault; |
| var rightIsPressed = right.ReadValueFromStateWithCaching(statePtr) >= right.pressPointOrDefault; |
|
|
| return MakeDpadVector(upIsPressed, downIsPressed, leftIsPressed, rightIsPressed); |
| } |
|
|
| public override unsafe void WriteValueIntoState(Vector2 value, void* statePtr) |
| { |
| var upIsPressed = up.IsValueConsideredPressed(value.y); |
| var downIsPressed = down.IsValueConsideredPressed(value.y * -1f); |
| var leftIsPressed = left.IsValueConsideredPressed(value.x * -1f); |
| var rightIsPressed = right.IsValueConsideredPressed(value.x); |
|
|
| up.WriteValueIntoState(upIsPressed && !downIsPressed ? value.y : 0f, statePtr); |
| down.WriteValueIntoState(downIsPressed && !upIsPressed ? value.y * -1f : 0f, statePtr); |
| left.WriteValueIntoState(leftIsPressed && !rightIsPressed ? value.x * -1f : 0f, statePtr); |
| right.WriteValueIntoState(rightIsPressed && !leftIsPressed ? value.x : 0f, statePtr); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public static Vector2 MakeDpadVector(bool up, bool down, bool left, bool right, bool normalize = true) |
| { |
| var upValue = up ? 1.0f : 0.0f; |
| var downValue = down ? -1.0f : 0.0f; |
| var leftValue = left ? -1.0f : 0.0f; |
| var rightValue = right ? 1.0f : 0.0f; |
|
|
| var result = new Vector2(leftValue + rightValue, upValue + downValue); |
|
|
| if (normalize) |
| { |
| |
| |
| const float diagonal = 0.707107f; |
| if (result.x != 0 && result.y != 0) |
| result = new Vector2(result.x * diagonal, result.y * diagonal); |
| } |
|
|
| return result; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public static Vector2 MakeDpadVector(float up, float down, float left, float right) |
| { |
| return new Vector2(-left + right, up - down); |
| } |
|
|
| internal enum ButtonBits |
| { |
| Up, |
| Down, |
| Left, |
| Right, |
| } |
| } |
| } |
|
|