diff --git a/Source/Engine/Engine/InputEvent.cs b/Source/Engine/Engine/InputEvent.cs index 176d21fd0..c6c46c43d 100644 --- a/Source/Engine/Engine/InputEvent.cs +++ b/Source/Engine/Engine/InputEvent.cs @@ -16,14 +16,24 @@ namespace FlaxEngine public string Name; /// - /// Returns true if the event has been triggered during the current frame (e.g. user pressed a key). Use to catch events without active waiting. + /// Returns true if the event has been triggered during the current frame (e.g. user pressed a key). Use , , to catch events without active waiting. /// public bool Active => Input.GetAction(Name); /// - /// Occurs when event is triggered (e.g. user pressed a key). Called before scripts update. + /// Occurs when event is pressed (e.g. user pressed a key). Called before scripts update. /// - public event Action Triggered; + public event Action Pressed; + + /// + /// Occurs when event is being pressing (e.g. user pressing a key). Called before scripts update. + /// + public event Action Pressing; + + /// + /// Occurs when event is released (e.g. user releases a key). Called before scripts update. + /// + public event Action Released; /// /// Initializes a new instance of the class. @@ -51,10 +61,25 @@ namespace FlaxEngine Input.ActionTriggered -= Handler; } - private void Handler(string name) + private void Handler(string name, InputActionState state) { - if (string.Equals(name, Name, StringComparison.OrdinalIgnoreCase)) - Triggered?.Invoke(); + if (!string.Equals(name, Name, StringComparison.OrdinalIgnoreCase)) + return; + switch (state) + { + case InputActionState.None: break; + case InputActionState.Waiting: break; + case InputActionState.Pressing: + Pressing?.Invoke(); + break; + case InputActionState.Press: + Pressed?.Invoke(); + break; + case InputActionState.Release: + Released?.Invoke(); + break; + default: break; + } } /// diff --git a/Source/Engine/Input/Input.cpp b/Source/Engine/Input/Input.cpp index 81411ed76..af5600823 100644 --- a/Source/Engine/Input/Input.cpp +++ b/Source/Engine/Input/Input.cpp @@ -97,7 +97,7 @@ Action Input::MouseLeave; Delegate Input::TouchDown; Delegate Input::TouchMove; Delegate Input::TouchUp; -Delegate Input::ActionTriggered; +Delegate Input::ActionTriggered; Array Input::ActionMappings; Array Input::AxisMappings; @@ -1022,9 +1022,9 @@ void InputService::Update() { for (auto i = Actions.Begin(); i.IsNotEnd(); ++i) { - if (i->Value.Active) + if (i->Value.State != InputActionState::Waiting) { - Input::ActionTriggered(i->Key); + Input::ActionTriggered(i->Key, i->Value.State); } } } diff --git a/Source/Engine/Input/Input.h b/Source/Engine/Input/Input.h index 84d312fa3..5ff02eda9 100644 --- a/Source/Engine/Input/Input.h +++ b/Source/Engine/Input/Input.h @@ -293,7 +293,7 @@ public: /// Event fired when virtual input action is triggered. Called before scripts update. See to edit configuration. /// /// - API_EVENT() static Delegate ActionTriggered; + API_EVENT() static Delegate ActionTriggered; /// /// Gets the value of the virtual action identified by name. Use to get the current config.