using UnityEngine.InputSystem.Layouts; using UnityEngine.InputSystem.Utilities; using UnityEngine.Scripting; namespace UnityEngine.InputSystem.Composites { /// /// A button with two additional modifiers. The button only triggers when /// both modifiers are pressed. /// /// /// This composite can be used to require two other buttons to be held while /// pressing the button that triggers the action. This is most commonly used /// on keyboards to require two of the modifier keys (shift, ctrl, or alt) /// to be held in combination with another key, e.g. "CTRL+SHIFT+1". /// /// /// /// // Create a button action that triggers when CTRL+SHIFT+1 /// // is pressed on the keyboard. /// var action = new InputAction(type: InputActionType.Button); /// action.AddCompositeBinding("ButtonWithTwoModifiers") /// .With("Modifier1", "<Keyboard>/leftCtrl") /// .With("Modifier1", "<Keyboard>/rightCtrl") /// .With("Modifier2", "<Keyboard>/leftShift") /// .With("Modifier2", "<Keyboard>/rightShift") /// .With("Button", "<Keyboard>/1") /// /// /// /// Note that this is not restricted to the keyboard and will preserve /// the full value of the button. /// /// /// /// // Create a button action that requires the A and X button on the /// // gamepad to be held and will then trigger from the gamepad's /// // left trigger button. /// var action = new InputAction(type: InputActionType.Button); /// action.AddCompositeBinding("ButtonWithTwoModifiers") /// .With("Modifier1", "<Gamepad>/buttonSouth") /// .With("Modifier2", "<Gamepad>/buttonWest") /// .With("Button", "<Gamepad>/leftTrigger"); /// /// /// /// [Preserve] [DisplayStringFormat("{modifier1}+{modifier2}+{button}")] public class ButtonWithTwoModifiers : InputBindingComposite { /// /// Binding for the first button that acts as a modifier, e.g. <Keyboard/leftCtrl. /// /// Part index to use with . /// /// This property is automatically assigned by the input system. /// // ReSharper disable once MemberCanBePrivate.Global // ReSharper disable once FieldCanBeMadeReadOnly.Global // ReSharper disable once UnassignedField.Global [InputControl(layout = "Button")] public int modifier1; /// /// Binding for the second button that acts as a modifier, e.g. <Keyboard/leftCtrl. /// /// Part index to use with . /// /// This property is automatically assigned by the input system. /// // ReSharper disable once MemberCanBePrivate.Global // ReSharper disable once FieldCanBeMadeReadOnly.Global // ReSharper disable once UnassignedField.Global [InputControl(layout = "Button")] public int modifier2; /// /// Binding for the button that is gated by the and . /// The composite will assume the value of this button while both of the modifiers are pressed. /// /// Part index to use with . /// /// This property is automatically assigned by the input system. /// // ReSharper disable once MemberCanBePrivate.Global // ReSharper disable once FieldCanBeMadeReadOnly.Global // ReSharper disable once UnassignedField.Global [InputControl(layout = "Button")] public int button; /// /// Return the value of the part while both and /// are pressed. Otherwise return 0. /// /// Evaluation context passed in from the input system. /// The current value of the composite. public override float ReadValue(ref InputBindingCompositeContext context) { if (context.ReadValueAsButton(modifier1) && context.ReadValueAsButton(modifier2)) return context.ReadValue(button); return default; } /// /// Same as in this case. /// /// Evaluation context passed in from the input system. /// A >0 value if the composite is currently actuated. public override float EvaluateMagnitude(ref InputBindingCompositeContext context) { return ReadValue(ref context); } } }