It's a cross platform tool for making in-game tutorials for the player, data driven and efficient. There are 4 different tutorial types you can use and everything is customisable, you can have different tutorials containers to manage your tutorials, each container has it's certain pros and cons, make sure you choose the best one based on what you're trying to achieve. It's packed with features so make sure you read the documentation carefully. Forgot to mention it's 100% blueprint! a free C++ plugin is also provided for handling things blueprint cannot handle!
Trailer
First Time Setup & Explanations
Popup
Message
Modal
World Prompt
Place BP_AdvancedTutorialsManager in the level.
This actor is the core of the asset and manages everything, also acts like a bridge into everything!
There should be only one instance of this in your world.
Asset Path: Content/AdvancedTutorialsManager/Blueprints
Select the Tutorials Manager actor in your level and then select your player character as the “Player Pawn” under “Settings” category.
Select the Tutorials Manager actor in your level and then check the “No Static Pawn Mode” box under “Settings” category.
Whenever your pawn gets spawned you have to call this function "Set Player Pawn" of Advanced Tutorials Manager.
You have access to tutorials manager everywhere, all you need to do is to type "Get Tutorials Manager"
If you're calling this frequently, cache it off as it searches through all the actors in the level which means it's not very cheap performance wise.
Make sure your player pawn is possessed by a player controller otherwise the asset will not start working.
Now it's time to add the actual tutorials!
Go to "Content/AdvancedTutorialsManager/Blueprints/Containers" then you have to pick a container type based on what you're trying to achieve. Let's start with a sequential container which is the simplest one, tutorials will trigger in a sequential approach, one by one.
There are 7 different types of containers which will be explained in details further down below!
Now that you have your container in the level you can add tutorials.
It's advised to have multiple containers with proper optimization settings.
Pick or create your tutorials data and enjoy!
(If you're picking sth make sure it's "DT_Sequential-Example_TM" other data tables are not associated with a sequential container)
Sequential
Triggers tutorials one by one in a sequential manner, which means there is an order in triggering. For example tutorial number 5 can only be triggered after tutorial number 4 is triggered! All tutorials will be displayed only once.
Use as much as sequential tutorials as you can! Very efficient.
Concurrent
Multiple tutorials can be triggered at the same time, there is no order regarding triggering tutorials. All tutorials will be displayed only once.
Repetitive
Multiple tutorials can be triggered at the same time without any order, tutorials will keep getting displayed as long as the trigger condition is valid, in other words, one tutorial might display several times!
It also has some unique features like persistent tutorials!
Manual
No triggering logic runs in this container, it's all manual! You have to trigger tutorials by yourself. Useful if you have some really complex logic to show a certain tutorial to the player.
Random Containers
These work exactly the same as regular ones with only one difference and that is the tutorials data are randomized.
These containers take 2 data tables, one for triggers, one for tutorials context!
Sequential
Triggers tutorials one by one in a sequential manner, which means there is an order in triggering. For example tutorial number 5 can only be triggered after tutorial number 4 is triggered! All tutorials will be displayed only once.
Use as much as sequential tutorials as you can! Very efficient.
Required Data Table Row Structure: FGenericTutorial_TM
Performance Cost: Cheap 😊
Concurrent
Multiple tutorials can be triggered at the same time, there is no order regarding triggering tutorials. All tutorials will be displayed only once.
Required Data Table Row Structure: FGenericTutorial_TM
Performance: Medium 🙂
Repetitive
Multiple tutorials can be triggered at the same time without any order, tutorials will keep getting displayed as long as the trigger condition is valid, in other words, one tutorial might display several times!
It also has some unique features like persistent tutorials!
Required Data Table Row Structure: FRepetitiveTutorial_TM
Performance: Expensive 🥴
Manual
No triggering logic runs in this container, it's all manual! You have to trigger tutorials by yourself. Useful if you have some really complex logic to show a certain tutorial to the player.
Required Data Table Row Structure: FManualTutorial_TM
Performance: Super Cheap 🤩
Random Containers
These work exactly the same as regular ones with only one difference and that is the tutorials data are randomized.
These containers take 2 data tables, one for triggers, one for tutorials context!
Required Data Table Row Structures
Data
Random Sequential & Concurrent: FTutorialData_TM
Random Repetitive Containers: FRepetitiveTutorialData_TM
Trigger
Random Sequential & Concurrent: FTutorialTrigger_TM
Random Repetitive Containers: FRepetitiveTutorialTrigger_TM
Required Data Table Row Structure: Data table you're gonna select for the container must have the row structure of this kind otherwise it'll break everything!
Tutorials Data Table: This one is the most important one. All of the tutorials data are set in this table.
Select the container you want to add tutorials to it
Create a new data table with the with respect to "Required Data Table Row Structure" specified for each container
Open up the data table and add rows!
Each row is a tutorial
Every row consists of 2 main sections:
1. Tutorial: Data that will be displayed, answers to the question "What to display?"
2. Trigger: Specifies the location or event to display the tutorial, answers to the question "When to display?"
This is the most standard structure for tutorials, all tutorial structures can be converted to this type. The following explanations are based on this structure.
There are 4 types of tutorials at the moment. (There are images above if you haven't seen already!)
Popup: You can show a short message and ask the player to press certain keys.
Message: Also used to display a message but the difference is it will pause the game and you can also show very long messages.
Modal: You can display a message along side some media which can be a video or image.
World Prompt: It displays as a prompt in world space, plays 3D sound and can be used for any actors!
Based on the tutorial type you pick, you might need to ignore or set certain values in the table which will be explained below, for instance if you're setting your tutorial type to "Message" then you can ignore media settings as they are for modals!
Title: Can be displayed for Modal or Message tutorials, you can change its display settings in theme settings.
Media (Only Available for Modals): If you’re going to use videos for this, make sure you put all the videos in “Content/Movies” directory of your project otherwise they won’t get packaged with your game!
For the best compatibility and performance, it is recommended to use H.264 encoded MP4 (.mp4) container files.
Audio: It will play when modal displays, this can be your video's audio or a voice over that you'd like to play. Leave it empty if you don't want any audio to play. If your video has audio, you'd have to separate the audio from it and select it here.
Content: This is the body of your tutorial and of course the most important part. There are some rules for this variable which are all written in its tooltip, whenever you forgot the rules just hover over it.
If you want to place a key from a mapping context simply type in "{ElementIndex}"
Element Index starts from 0 and it must match the Input Setup variable underneath the content.
If it's an axis mapping make sure you check "Is Axis Mapping" under Input Setup settings.
If the input is not an axis mapping then only the first key will be displayed but if it is an axis mapping, all keys mapped to the platform will be displayed.
Here’s the common rules:
Use "Shift+ Enter" for line breaks
You can also enter key name directly instead of action name but that would be static! e.g. {Enter}, {Escape}, {Gamepad_FaceButton_Bottom} and etc. Keep in mind these are used for displaying only! The asset cannot detect the key press on them.
For checking out the key names you need to use AdvancedTutorialsManagerExtras Plugin which will be explained later, there will be a button for displaying all possible keys then you can use them.
You can also check out the key names by the decorator’s tables, if you head over to "Content/AdvancedTutorialsManager/UI/KeysAndButtons" you can find the decorator table of each platform in its directory.
And here’s the table itself:
In order to make input keys work, you'd need to register your inputs to Tutorials Manager.
For those inputs you're gonna use in tutorials you have to add "Tutorials Input Gate" macro to your input actions event.
There's this other function "Tutorials Input Gate Prototype" which can be used for prototyping since it doesn't need a ref to Tutorials Manager. It's expensive!
Type
Auto Expire: The tutorial will be on screen till its Auto Expire Time elapses
On Any Input Triggered: The tutorial will hide if the player presses any keys in the tutorial's context
On All Input Triggered: The tutorial will hide if the player presses all of the keys in the tutorial's context
Manual: You have to call "LearnedTutorial" function by yourself. Get the TutorialsManager's reference and call the function. You can store the reference in GameMode or GameInstance or even in the player character's blueprint!
Auto Expire Time is the maximum lifetime of the tutorial. (Only for popup and world prompts)
You can set it to negative values for infinite lifetime.
Type
In Range: The tutorial will show up if the player is within a radius of trigger location
On Crossed: If the player crosses the point tutorial will get displayed. Keep in mind that the target actor's forward vector would be the forward of the cross plane. If there's no target actor, then it'll be based off player's initial location.
Instant: Basically no condition, will trigger as soon as possible.
Manual: You have to call "PopTutorial" function yourself. Get the Container's reference and call the function. You can store the reference in GameMode or GameInstance or even in the player character's blueprint!
Triggering it is fairly simple you have to get a reference of the Container actor and then call the "PopTutorial" function by yourself!
NOTE: If your container is not a random type, then Tutorial Idx is the same as Trigger Idx.
If it is a random container it probably doesn't make any sense that you'd be interested in manual triggers!
Location Settings
You can whether use a "Target Actor" as the trigger location or you can input a "Custom Location". Target actor has higher priority, therefore if you set Target Actor, Custom Location will be ignored.
World Prompt Settings
World prompts show up at the trigger location, however, you can add some offset to the prompt using "Relative Offset" to adjust the displaying location
Radius: if the player gets closer than the radius to the target location, the tutorial will show up.
This would only apply if the trigger type is set to "In Range"
Abandon Settings
It's some sort of fallback in case player missed the tutorial but we really want to display it to them, therefore, abandon radiuses are often very big values.
If the player goes further than the abandon radius then the tutorial will be abandoned and abandon action will kick in.
Negative values mean that the tutorial will never get abandoned.
Abandon Action
Show: Display tutorial on abandon
Forget: Won't display anything
BP_TutorialTargetPoint
You can use these actors as the target actor for your trigger locations.
The actor’s name will show up on top of them and there will be an icon for you to easily recognize the tutorial points.
The advantage of using them is to keep your scene more organized.
Path: Content/AdvancedTutorialsManager/Blueprints
Please try out the example project to get a good understanding of all these.
Pretty much the same as FGenericTutorial_TM but with some minor differences.
Has an extra ending type called "Persistent"
If you set a tutorial ending type to persistent it will keep on displaying as long as the trigger is valid, imagine you have an in range tutorial, as long as the player is within the trigger range it'll be displayed on the screen and as soon as the player leaves the trigger area it will hide.
Trigger type is limited to "In Range" and "On Crossed" only
There is no abandon option for them
Highly advanced and low level.
It has no trigger settings as the developer is responsible for triggering manual tutorials
Supports standard ending types
Player Pawn: It has to be set to your main playable character in the level
No Static Pawn Mode: If your player pawn gets spawned after begin play then you can check this option, you can ignore Player Pawn in details panel. However, whenever your pawn gets spawned you have to call "Set Player Pawn" function of Advanced Tutorials Manager.
Platform
Default Platform: The platform that the manager starts with by default, you can always change platform on the fly by calling "Set Platform" function
Platforms Data: You don't need to modify this if you're using the supported platforms, it will be explained in details down below
User Interface
Theme: You can set a theme for your manager, the asset has Dark and Light theme by default but you can always add your own. If it was looking lit, make sure you share it with the community and also I might include it with the asset for everyone!
Themes are stored at "DT_Themes_TM" in "AdvancedTutorialsManager/UI/Themes" directory.
UI Mode: You can pick 2D or 3D, 3D mode is made for VR projects.
Advanced
UI ZOrder: This is the ZOrder that 2D UI will be created with, if some random widgets were displaying on top of your tutorials then you should probably increase this value
Timings
Close Tutorial On Input Triggered Delay: When the player presses the keys you ask for in the tutorial, this would be the delay to close tutorial
Min Tutorial Display Time: Tutorial will not hide sooner than this time even though end condition is met
Next Tutorial Popping Delay: When a tutorial finishes this delay will prevent the next one to pop immediately
Modal
Modal Approval Hold Time: Required time for user to hold down the modal close key in order to hide modal
Gamepad
Auto Gamepad Detection: You can turn this feature on or off, whenever a key presses from a gamepad in game the platform will be changed to "Gamepad Default Platform" automatically. Useful if you're a PC developer
Save & Load
Auto Save & Load: Automatically saves all containers data per tutorial trigger! Save data is based on Row Names in your tutorials table so if you change the row names your auto save data will be invalid, make sure you remove the save data using "Delete Auto Save Data"
Furthermore, if you have a checkpoint system it's best to keep this feature off and save and load data by yourself. Also you cannot use this feature if your game supports multiple save slots, in that case you should be storing the save data in your main save game. There are more details on how to do that later on in this document.
Platforms Data: This one is a bit tricky. If you don’t want to add custom platforms just skip this part.
Each platform needs a decorator table for its keys textures that we use for the Rich Text in the UI.
So, if you want to add a new custom platform the first thing you’re going to need is the decorator table.
Then you should add that platform to DT_PlatformsKeys_TM data table and map KeyFName to underlined Key Display Name. You can generate this text using Advanced Tutorials Manager Extras Plugin which you can find the link at the end of this documentation.
BP Tutorials Manager Settings
You should add your new platform name here and then map all the keys like so. Follow the pattern.
P.S: Due to some copyright issues we had to use alternative names for the platforms.
PS: PlayStation
XB: Xbox
VIdx: Valve Index
HVive: HTC Vive
OcsQuest: Oculus Quest
DT_PlatformKeys_TM
Tutorials Data Table: You should be familiar with this one already. The tutorials data for the container
Optimization
Disabled: If you're not using the container you can disable it but still have it in the scene or even enable it later on!
Tick Radius: It's advised to set this for all of your containers if possible, tick radius must contain all of your containers triggers, it's often a really big value. Container will be disabled when player is not within this radius of the container's actor in the world.
The pink sphere is the tick radius so if the player is out of that radius there is no way that this container show any tutorials because it'd be disabled!
Destroy On All Tutorials Learned: When all the tutorials in the container mark as learned then the container will destruct itself to save some memory!
Saving
Exclude From Saving: You can exclude certain containers from the Save Data
The only difference is that random containers trigger and tutorial data tables are separated. And that's because container shuffles tutorial data but it won't shuffle triggers!
Other than this everything else is pretty much the same.
You can add a handful of themes and also change themes on the fly (which is not recommended)
Themes are stored at DT_Themes_TM in Content/AdvancedTutorialsManager/UI/Themes directory.
If you wanna add themes or modify them this is the place you have to go.
You can change font, sounds, colors and animations settings.
Most of settings are pretty straight forward so I will just explain the tricky ones!
Font
4 fonts are included with the asset, feel free to pick the one that matches your game the most or you can use your own!
The font you use must have these 3 typefaces:
Default: Common texts will use this typeface
Title: Used for titles in the UI (Modal and Message have titles)
Button: Used for any buttons in the UI
Animations
There are 3 types of main animations that you blend together. The catch is that you can only have one of each type! There are Fade, Scale and Translate.
Also your open or close animations can be different.
Translation Settings
Translate X: It will move the widget along X axis, where it goes is based on the widget alignment settings, the asset will always try to pick closest corner.
Translate Y: Similar to translate X but it will move the widget along Y axis. You can tick both of these as well, go creative with it.
Curve: This is essentially the translation movement style, there are a bunch of curves that you can choose from including elastic and bounce! Feel free to use your custom curves as well!
World Prompt
Display Bottom Triangle: You can toggle the triangle visibility if you don't like it!
Always Upright: If you check this world prompt will always align with the world Z axis other wise it will face the camera entirely, on all axes.
Anything that is not in the theme settings, you can modify by heading over to the Widget Blueprint and modify there manually.
Read this section if you're not using the Auto Save & Load feature.
For setting up your own save data you can take a look at BP_TutorialsManagerSave located at "Content/AdvancedTutorialsManager/Blueprints/Saving".
There is also this debug mode that if you enable you'll see how data is being saved and handled with auto save.
NOTE: Make sure you disable auto save and load feature if you're doing it manually. You can do this by selecting Tutorials Manager in the scene, under "Settings" you'll find it.
Saving
The procedure to make your own saving system is straight forward, you need to access Tutorials Manager and then call "Serialize Data" function, it will return a map which first element is the container's name and second element is container data.
You have to add this variable type to your save game blueprint and store it.
Loading
For loading again take the Tutorials Manager ref and call the "Load" function. You just need to read the data from your save game and feed it into this function.
If a container was not getting saved, it's probably marked as "Exclude from Save Data", you can disable this in the container settings in your level or in its blueprint.
Turn on Container's debug mode to see what's going on in the background!
There are a bunch of debugging tools added to this asset to help you find the issue you facing easily.
If you select a Container in your level you'll see these options under "Assistance" tab.
Draw Everything
Draws debug for all of your tutorial triggers so that you can see when and how they are going to trigger!
Colors Definitions Mapping
Green: In Range Trigger Radius
Yellow: Abandon Radius
Green Plane: On Crossed plane, keep in mind this plane extend indefinitely and is not limited to this size!
Pink: Containers Tick Radius (Optimization)
Validate Tutorials Data
By pressing this button your data table will be checked to see if there's any obvious issues or not. Unfortunately it will not find out if you're using the wrong row structure for your data table so keep that in mind.
If you don’t have the output log, you can bring from Window -> Output Log at the main tab of the engine.
If you have no errors then you should see the following logs:
Sequential Containers Debug Only
Starting Tutorial Row: So if you want to display a tutorial all you need to do is find the row number of that tutorial in the data table and set it as Start Row Number and then if you play the game that would be the first tutorial that shows up. Make sure Debug Mode is enabled otherwise that will not work!
Preview Tutorial Row works exactly the same.
If you can’t see the preview button, it’s because you have to select the container actor in the level.
Now that you picked the preview tutorial row, you can whether "Preview Tutorial Trigger Area" or "Preview World Prompt"
This is a preview of On Crossed trigger type without an abandon radius.
And this is the preview of In Range with abandon radius, the yellow sphere is the abandon area, green sphere is the original trigger radius:
For a bit of additional control over the asset we've also included a free code plugin to do whatever blueprints cannot!
You might need to compile it by yourself if you're using different engine versions.
With this plugin you can scale key icons in your rich text and also you can print all key names!
Print All of Keys
Go to the plugin content folder, run widget utility and then click on Print All Keys button.
If it didn't work open up the blueprint and in the button's on click event add this blueprint node "Print All The Keys"
Print Keys Lookup Table
This is useful if you're trying to add a brand new platform to the asset. The generated format is in JSON style, so you can just export the DT_PlatformsKeys_TM as JSON, copy paste your generated lookup table text under the new platform data and then reimport using the JSON file.
Scale Key Icons
Locate BP_TutorialsManager_MasterDecorator in the following path:
Content/AdvancedTutorialsManager/UI/KeysAndButtons
Open it up and then click on Open Full Blueprint Editor
Click on "Class Settings" then change Parent Class to "ATMInputKeysImageDecorator"
Then select "Reparent"
Now go back to "Class Defaults" and then you can see "Relative Image Scale"
You can play around with this value and see which one you like. It's relative to the font size. You should probably pick a value between 1 and 2.
Save and Run the Game!
Congratulations! You've mastered the asset.
I'd be really delighted to know your opinion about the asset so feel free to leave a review for us! 😊
Thank you for purchasing the plugin, hope you enjoy it
Whenever a feature didn’t work, check out the output log first. You’ll probably find something useful there.
All of the screenshots used in this document are from the example map of the asset.
I tried to set a tooltip for every variable and function in the asset, so always check the tooltips first if you run into uncertainty.
Custom keys (Direct Keys like {Enter}) are the cheapest way to show keys but they are not functional.
If you had any question after reading this documentation, feel free to send me an email. thekooroshtorabi@gmail.com I will try to answer ASAP
Make sure you join the discord channel! Here's the link!
Added
New Feature: You can now play audio for modals, this can be the audio of the video or some voice over.
Fixed
World prompts was not hiding in certain situation
Modal Approval Time of tutorials manager was not working at all
Added
Combo key example
Changes
Platforms no longer need search expression, they would need a data table set up now, explained in platforms section
Fixed
Input system incompatibility with multi lingual projects
Combo keys were broken
Changes
Improved Save System, it should be more optimized now and easier to maintain
Changes
Container's enable/disable state will now be saved and loaded
Added "_Internal Disable" and "_Internal Enable" to the containers, these are used within the system internally, should not be called by user
Fixes
Disabling a container will now flush the queued tutorials from the manager
Bug fixes with enable/disable system
Changes
Reset function added to the containers and the manager
Enable/Disable feature added to the manager
Fixes
Fixed an auto save bug for concurrent containers that it was saving the wrong index
Containers
Changes
Focus issue in shipping builds fixed
Updated PC decorator data tables for mouse icons
Fixed a packaging error due to manual bp not being compiled
Changes
Bug fixes and stability improvments