using System; using System.Diagnostics; using UnityEngine.InputSystem.Controls; ////TODO: API to get the control and device from the internal context ////TODO: ToString() namespace UnityEngine.InputSystem { /// /// Wraps around values provided by input actions. /// /// /// This is a wrapper around chiefly for use /// with GameObject messages (i.e. ). It exists /// so that action callback data can be represented as an object, can be reused, and shields /// the receiver from having to know about action callback specifics. /// /// [DebuggerDisplay("Value = {Get()}")] public class InputValue { /// /// Read the current value as an object. /// /// /// This method allocates GC memory and will thus create garbage. If used during gameplay, /// it will lead to GC spikes. /// /// The current value in the form of a boxed object. public object Get() { return m_Context.Value.ReadValueAsObject(); } ////TODO: add automatic conversions /// /// Read the current value of the action. /// /// The current value from the action cast to the specified type. /// Type of value to read. This must correspond to the /// of the action or, if it is a composite, by the /// . /// The type depends on what type of controls the action is bound to. /// Common types are float and /// The given type /// does not match the value type expected by the control or binding composite. /// /// The following example shows how to read a value from a message. /// The given InputValue is only valid for the duration of the callback. Storing the InputValue references somewhere and calling Get<T>() later does not work correctly. /// /// /// /// using UnityEngine; /// using UnityEngine.InputSystem; /// [RequireComponent(typeof(PlayerInput))] /// public class MyPlayerLogic : MonoBehaviour /// { /// private Vector2 m_Move; /// /// // 'Move' input action has been triggered. /// public void OnMove(InputValue value) /// { /// // Read value from control. The type depends on what type of controls the action is bound to. /// m_Move = value.Get<Vector2>(); /// } /// /// public void Update() /// { /// // Update transform from m_Move /// } /// } /// /// /// public TValue Get() where TValue : struct { if (!m_Context.HasValue) throw new InvalidOperationException($"Values can only be retrieved while in message callbacks"); return m_Context.Value.ReadValue(); } ////TODO: proper message if value type isn't right /// /// Check if the action button is pressed. /// /// /// True if the button is activated over the button threshold. False otherwise /// The following example check if a button is pressed when receiving a message. /// The given InputValue is only valid for the duration of the callback. Storing the InputValue references somewhere and calling Get<T>() later does not work correctly. /// /// /// /// [RequireComponent(typeof(PlayerInput))] /// public class MyPlayerLogic : MonoBehaviour /// { /// // 'Fire' input action has been triggered. /// public void OnFire(InputValue value) /// { /// if (value.isPressed) /// FireWeapon(); /// } /// /// public void FireWeapon() /// { /// // Weapon firing code /// } /// } /// /// /// public bool isPressed => Get() >= ButtonControl.s_GlobalDefaultButtonPressPoint; internal InputAction.CallbackContext? m_Context; } }