using UnityEngine.InputSystem.Layouts; using UnityEngine.InputSystem.Utilities; using UnityEngine.Scripting; ////TODO: generalize the WithModifier composites so that they work with any kind of control, not just buttons namespace UnityEngine.InputSystem.Composites { /// /// A button with an additional modifier. The button only triggers when /// the modifier is pressed. /// /// /// This composite can be used to require another button to be held while /// pressing the button that triggers the action. This is most commonly used /// on keyboards to require one of the modifier keys (shift, ctrl, or alt) /// to be held in combination with another key, e.g. "CTRL+1". /// /// /// /// // Create a button action that triggers when CTRL+1 /// // is pressed on the keyboard. /// var action = new InputAction(type: InputActionType.Button); /// action.AddCompositeBinding("ButtonWithOneModifier") /// .With("Modifier", "<Keyboard>/leftCtrl") /// .With("Modifier", "<Keyboard>/rightControl") /// .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 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("ButtonWithOneModifier") /// .With("Modifier", "<Gamepad>/buttonSouth") /// .With("Button", "<Gamepad>/leftTrigger"); /// /// /// /// [Preserve] [DisplayStringFormat("{modifier}+{button}")] public class ButtonWithOneModifier : InputBindingComposite { /// /// Binding for the 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 modifier; /// /// Binding for the button that is gated by the modifier. The composite will assume the value /// of this button while the modifier is 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 if is 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(modifier)) 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); } } }