From b56b9e65b86da1253fc7b013752113774c670f2b Mon Sep 17 00:00:00 2001 From: Steve Streeting Date: Fri, 23 Oct 2020 12:54:17 +0100 Subject: [PATCH] Move input and widgets docs to their own pages --- ReadMe.md | 125 ++-------------------------------------- Resources/lastinput.png | Bin 0 -> 61745 bytes doc/Input.md | 56 ++++++++++++++++++ doc/Widgets.md | 107 ++++++++++++++++++++++++++++++++++ 4 files changed, 167 insertions(+), 121 deletions(-) create mode 100644 Resources/lastinput.png create mode 100644 doc/Input.md create mode 100644 doc/Widgets.md diff --git a/ReadMe.md b/ReadMe.md index d98a21c..22814a4 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -5,21 +5,10 @@ This is a helper plugin library for [Unreal Engine 4](https://www.unrealengine.com) which makes a bunch of things better: -* UI Improvements - * FocusableButton: button which uses Hover style to highlight when it has focus (keyboard / gamepad) - * FocusablePanel: which ensure a widget is focussed when gamepad is activated so navigation is reliable - * Also remembers last focussed widget so it can be restored when used in context stacks - * FocusableUserWidget: A hack to allow UserWidgets to delegate their focus requests to a child item (required to make focus work reliably with compound widgets) - * InputImage: Image which will change itself to an image representing a button / key based on an input action - * (It changes dynamically when the input method changes e.g. when player moves a gamepad stick) - * Includes use of a UiTheme data asset which maps FKeys to Sprite images of buttons - * MenuStack/MenuBase: a context stack of widgets so you can easily create menu sequences, implement "back" navigation - * OptionWidgetBase: a widget which implements the "choose an item" concept but adapts between mouse and keyboard/gamepad - style navigation depending on what the currently used input method is -* Input Improvements - * Tracks last used input method (keyboard / mouse / gamepad) per player - * Events raised whenever a player uses a different input method (in game, and in UI) - (Actually reliable and not dependent on vagaries of input mappings / differences between UI and game input) +* [New Widgets](doc/Widgets.md) + * Focusable buttons, menu stacks, control prompts and more +* [Input events](doc/Input.md) + * Reliable notification when the player changes input method :heart: **[Support my work on Patreon!](https://www.patreon.com/stevestreeting)** @@ -103,112 +92,6 @@ if (GS) ``` -## Widgets - -Several custom widgets are supplied to assist with some common challenges: - -* [OptionWidgetBase](docs/OptionWidget.md) - - This widget base class adds "option switch" functionality, allowing a user to - select one of a number of options by moving through them in a linear list. - It handles both mouse and gamepad by automatically switching styles between - separate clickable arrows for mouse, and a unified left/right rocker style - for gamepads. Styleable in Blueprint subclasses. - -* [InputImage](docs/InputImage.md) - - This custom Image widget takes an Action or Axis name and will automatically - display the image for an associated bound control, based on the currently - active input method. Dynamically switches as input method changes. - -* [FocusableButton](docs/FocusableButton.md) - - A refined Button widget which raises focus events you can listen to, and - which can apply the "Hovered" style to itself when focused (very important - for gamepad navigation). - -* [FocusablePanel](docs/FocusablePanel.md) - - A Panel widget which can make sure that something is selected when a - gamepad is in use, and resists loss of focus. Has a default focus widget, - and also remembers the last focus widget if you switch away & back - without destroying it. - -* [MenuBase](docs/MenuBase.md) - - A specialised [FocusablePanel](docs/FocusablePanel.md) which adds the ability - to be part of a contextual [MenuStack](docs/FocusablePanel.md), and which - as it becomes the top of the stack can automatically grab focus, change game - pause state, alter input modes, and change the mouse pointer visibility - (all individually optional). - -* [MenuStack](docs/MenuStack.md) - - A container for and stack of [MenuBase](docs/MenuBase.md) instances, making it - easy to create multi-level on-screen menus with a simple "back" navigation. - - -# Additional Configuration - -## UiTheme - -Some features of this plugin such as InputImage need a `UUiTheme` asset, which -is just a Data Asset based on the `UUiTheme` class which references other -resources like button images. There is one in the Examples project as reference. - -### Create a UiTheme: - - -1. Click Add New > Miscellaneous > Data Asset -1. Select "UiTheme" as the class -1. Save the new asset with your chosen name - -### Create a Primary Asset Label - -UiThemes are a new kind of primary asset, loaded at runtime. To ensure this -asset is included when packaging, create a Primary Asset Label in the same folder: - -1. Click Add New > Miscellaneous > Data Asset -1. Select "Primary Asset Label" as the class -1. Name it however you like -1. Double-click to edit -1. Under "Explicit Assets", add an entry and pick the UiTheme you created above -1. Save the changes - -This just ensures that the packaging system knows to include your UiTheme, since -it won't be directly referenced by any other primary asset. - -### Create button sprite data - -The UiTheme wants to reference DataTables which contain links between the input -keys and button sprites. So the first job is to create the button sprites. - -The Example project includes some button sprites already; contained in a packed -sprite sheet. I created these using TexturePacker and imported into UE which created -the sprites, but you can create them however you like. However, we do require sprites -rather than plain textures. - -This means you must have the Paper2D plugin enabled in your project. - -### Linking input keys to button sprites -Once you have a set of button sprites, you need to create DataTables which map -input FKeys (which can be keys, or mouse buttons, or gamepad buttons / sticks) -to these sprites, so that for example InputImage can be told to display the action -"Fire", and then display either say the left mouse button or a gamepad trigger -depending on what's being used. - -Personally I did this using a CSV file for ease of use, for example: - -```csv -Name,Key,Sprite -Gamepad_LeftX,Gamepad_LeftX,"PaperSprite'/Game/Textures/UI/Sprites/Frames/XboxOne_Left_Stick'" -Gamepad_FaceButton_Bottom,Gamepad_FaceButton_Bottom,"PaperSprite'/Game/Textures/UI/Sprites/Frames/XboxOne_A'" -``` - -You should import this as a DataTable based on the KeySprite type. A separate -one is needed for keyboard / mouse and gamepad. Once you've created them, or -copied the ones from the examples, you should update the UiTheme asset you -created to point at these data tables. # License diff --git a/Resources/lastinput.png b/Resources/lastinput.png new file mode 100644 index 0000000000000000000000000000000000000000..1760ab879ee6af98a81f7d8b935cbe72df844356 GIT binary patch literal 61745 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 H^Pv9&>mfb) literal 0 HcmV?d00001 diff --git a/doc/Input.md b/doc/Input.md new file mode 100644 index 0000000..53b9565 --- /dev/null +++ b/doc/Input.md @@ -0,0 +1,56 @@ +# Input Helpers + +Unreal lacks an in-built way to determine the currently used input method by +a player, and ways to be notified when that changes. So I fixed that 😄 + +All these functions are available on "Steves Game Subsystem", which you can +get on a Blueprint like this: + +![Game Instance Subsystem](../Resources/gameinstance.png) + +Or in C++ like this: + +```c++ +#include "StevesUEHelpers.h" + +... +auto GS = GetStevesGameSubsystem(GetWorld()); +``` + + +## Getting the last input device for a player + +Blueprint: + +![Game Instance Subsystem](../Resources/lastinput.png) + +C++: + +```c++ +EInputMode Mode = GS->GetLastInputModeUsed(PlayerIndex); +``` + +## Listening for when player changes input device + +Blueprint: + +![Game Instance Subsystem](../Resources/bpexample.png) + +C++: + +```c++ +// Subscribe somewhere in your code +void AYourClass::ListenForInputModeChanges() +{ + auto GS = GetStevesGameSubsystem(GetWorld()); + GS->OnInputModeChanged.AddDynamic(this, &AYourClass::InputModeChanged); +} +``` + +```c++ +// This is your method which gets called +void AYourClass::InputModeChanged(int PlayerIndex, EInputMode NewMode) +{ + ... +} +``` diff --git a/doc/Widgets.md b/doc/Widgets.md new file mode 100644 index 0000000..e17f726 --- /dev/null +++ b/doc/Widgets.md @@ -0,0 +1,107 @@ +# Widgets + + +Several custom widgets are supplied to assist with some common challenges: + +* [OptionWidgetBase](OptionWidget.md) + + This widget base class adds "option switch" functionality, allowing a user to + select one of a number of options by moving through them in a linear list. + It handles both mouse and gamepad by automatically switching styles between + separate clickable arrows for mouse, and a unified left/right rocker style + for gamepads. Styleable in Blueprint subclasses. + +* [InputImage](InputImage.md) + + This custom Image widget takes an Action or Axis name and will automatically + display the image for an associated bound control, based on the currently + active input method. Dynamically switches as input method changes. + +* [FocusableButton](FocusableButton.md) + + A refined Button widget which raises focus events you can listen to, and + which can apply the "Hovered" style to itself when focused (very important + for gamepad navigation). + +* [FocusablePanel](FocusablePanel.md) + + A Panel widget which can make sure that something is selected when a + gamepad is in use, and resists loss of focus. Has a default focus widget, + and also remembers the last focus widget if you switch away & back + without destroying it. + +* [MenuBase](MenuBase.md) + + A specialised [FocusablePanel](FocusablePanel.md) which adds the ability + to be part of a contextual [MenuStack](MenuStack.md), and which + as it becomes the top of the stack can automatically grab focus, change game + pause state, alter input modes, and change the mouse pointer visibility + (all individually optional). + +* [MenuStack](MenuStack.md) + + A container for and stack of [MenuBase](MenuBase.md) instances, making it + easy to create multi-level on-screen menus with a simple "back" navigation. + + +# Additional Configuration + +## UiTheme + +Some features of this plugin such as InputImage need a `UUiTheme` asset, which +is just a Data Asset based on the `UUiTheme` class which references other +resources like button images. There is one in the Examples project as reference. + +### Create a UiTheme: + + +1. Click Add New > Miscellaneous > Data Asset +1. Select "UiTheme" as the class +1. Save the new asset with your chosen name + +### Create a Primary Asset Label + +UiThemes are a new kind of primary asset, loaded at runtime. To ensure this +asset is included when packaging, create a Primary Asset Label in the same folder: + +1. Click Add New > Miscellaneous > Data Asset +1. Select "Primary Asset Label" as the class +1. Name it however you like +1. Double-click to edit +1. Under "Explicit Assets", add an entry and pick the UiTheme you created above +1. Save the changes + +This just ensures that the packaging system knows to include your UiTheme, since +it won't be directly referenced by any other primary asset. + +### Create button sprite data + +The UiTheme wants to reference DataTables which contain links between the input +keys and button sprites. So the first job is to create the button sprites. + +The Example project includes some button sprites already; contained in a packed +sprite sheet. I created these using TexturePacker and imported into UE which created +the sprites, but you can create them however you like. However, we do require sprites +rather than plain textures. + +This means you must have the Paper2D plugin enabled in your project. + +### Linking input keys to button sprites +Once you have a set of button sprites, you need to create DataTables which map +input FKeys (which can be keys, or mouse buttons, or gamepad buttons / sticks) +to these sprites, so that for example InputImage can be told to display the action +"Fire", and then display either say the left mouse button or a gamepad trigger +depending on what's being used. + +Personally I did this using a CSV file for ease of use, for example: + +```csv +Name,Key,Sprite +Gamepad_LeftX,Gamepad_LeftX,"PaperSprite'/Game/Textures/UI/Sprites/Frames/XboxOne_Left_Stick'" +Gamepad_FaceButton_Bottom,Gamepad_FaceButton_Bottom,"PaperSprite'/Game/Textures/UI/Sprites/Frames/XboxOne_A'" +``` + +You should import this as a DataTable based on the KeySprite type. A separate +one is needed for keyboard / mouse and gamepad. Once you've created them, or +copied the ones from the examples, you should update the UiTheme asset you +created to point at these data tables.