"Tale is stupidly simple at its core: just a queue, a list, and multiple actions. However, the result is a framework more elegant, powerful and easy to use than any other generic system that I could've ever created for Unity. The simplicity comes from Tale itself, while the power comes from the actions. Need to do something very specific that Tale can't already do? Just create an action and let Tale do the heavy lifting for you." -- UW
The Tale logo
Tale is a powerful prop manipulation utility designed for storytelling, built for Unity. More specifically, it's a modular framework for creating and executing actions (either sequentially or in parallel) which manipulate objects and components in order to do something useful. For example, the dialog action uses a canvas, some animators and some text components to provide a very customizable dialog system.
Tale comes with a set of premade actions for manipulating scenes, dialog, transitions, sound, music, cameras and cinematics. It is very customizable, due to the fact that the user can use any assets and animations which the framework can manipulate at higher levels. Therefore, it can be adapted to work in almost any context.
The original code for Tale was written by UW, and is currently maintained by him and AndrewIGD. The framework was originally created to ease the development of story-driven games.
Since its release, Tale has been used in most (if not all) games created by the Deprimus members, and has become a core part of the development of new games.
UW has always had a passion for visual novels. His first story-driven games were created with Ren'Py, a popular visual novel engine. However, when he wanted to add proper gameplay, he quickly reached the limits of Ren'Py due to the engine being specifically designed for visual novels.
Turning to Unity, UW had to implement all of the core systems (which Ren'Py gave away for free) from scratch: dialog management, transitions, etc. His first dialog system for D1 was considered by him mediocre at best, and horrible at worst. There was also the problem that, since the dialog system was engineered specifically for a single game, he had to rewrite it to accomodate other projects.
UW was tired of constantly rewriting the same systems for every project, so he started working on a project that would now be known as Tale: a modular action-driven queue-based framework for manipulating props. The framework initially included support for dialogs and transitions, later being extended with audio, camera and cinematic support.
Since its release, Tale was met with critical acclaim among the Deprimus members, and is currently the go-to solution for Unity projects.
Tale comes with a set of actions that can be used to manipulate:
Due to its modularity, Tale allows the user to implement their own actions which can be used to extend the framework. These actions can be ad-hoc (i.e. specific to a single project), meaning that no control is lost by using Tale.
Tale also includes a configuration file which can be used to change various options (e.g. how fast the text appears in the dialog box). This config can be extended further for new actions.
Want to show a dialog message? Simply write:
Tale.Dialog("Character", "Message");
How about also playing a sound at the same time?
Tale.Sound.Play("MySound");
Tale.Dialog("Character", "Message");
That's great, but how about waiting for the sound to finish?
Tale.Sound.Play("MySound");
Tale.Sound.Sync();
Tale.Dialog("Character", "Message");
How about looping some music, fading in, and showing dialog at the same time?
Tale.Music.Play("MyMusic", Tale.Music.PlayMode.LOOP);
Tale.Multiplex(
Tale.Transition("fade", Tale.TransitionType.IN),
Tale.Dialog("Character", "Message")
);
And this is just barely scratching the surface.
Using Tale is all about placing actions on a queue. An action is executed in the span of multiple frames. The current action (i.e. the first in the queue) has its Run method called every frame. When the action is done (i.e. Run returns true), it's removed from the queue and the next action becomes the current one. This happens indefinitely.
There is also a list which is used for parallel actions. Every action that is added to this list will run at the same time as all other actions. An actions can be placed on the parallel list simply by wrapping it around Tale.Parallel. In simple terms: every action in the parallel list and the first action in the queue all have their Run method called every frame.
There is a special Multiplex action which runs multiple actions at the same time, but waits for all of them to complete before marking itself as done. This is one of the most powerful actions.
The beauty of Tale is that both Multiplex and Parallel, while being seen as "special", are ordinary Tale actions, meaning that they could've been very well written by a user. There are no actions that receive special treatment.
TaleExtra is a group of extra actions, either new or obtained by combining existing actions with diferent arguments. There isn't a single TaleExtra project. Rather, some games that use Tale have a set of different extra actions (which are gathered under the name TaleExtra): extra transitions, custom exec actions, etc. Extra actions that are generic and frequently used in many games may end up into Tale itself as official builtin actions.