Simple Unity3D cutscene sequencer with RPG-style animated paged dialog support
- Declarative cutscene creation
- Completion notifications
- Ability to run coroutines within cutscene actions
- Support for instantiating prefabs
- Showing RPG-style paged, docked dialogs with animating text, reading time, and next-page button support
Mainly for game devs who want to add quick, simple 2D RPG-style cutscenes without importing a package with a ton of assets. If all you want is a cutscene runner with basic support for waiting on user input, instantiating prefabs, and dialog support then this is for you. FYI: a unitypackage is a work-in-progress.
If you want full cinematic, 3D cutscene support with a great editor check out the Cinema Director asset.
- Create a Unity Canvas to hold the dialog, e.g.
CutsceneCanvas
. - Attach the
Cutscene Controller
script component to it. - Create an empty GameObject under
CutsceneCanvas
to hold your prefabs: e.g.CutscenePrefabs
. - Attach the
Cutscene Prefabs
script component to it. - Create a Panel under
CutsceneCanvas
to represent your dialog. You can name itDialogPanel
. - Create a Text under
DialogPanel
to represent your dialog text, e.g.DialogText
. - Create a Button under
DialogPanel
to represent your next page button, e.g.NextPageButton
. - Wire up all the Inspector fields for
Cutscene Controller
. Make sure to also hook up the Next Button's Click event to theCutsceneController's
OnNextPageBtnClick()
. - Add any prefabs you will instantiate (with ids) for
Cutscene Prefabs
.
Create a cutscene:
var cutscene = new Cutscene() {
new DialogAction("Very basic cutscene"),
new WaitAction(2),
new ShowDialogAction(false),
};
Run the cutscene through the cutscene controller, attached as a component to the cutscene canvas:
var cutsceneCanvas = GameObject.Find("CutsceneCanvas");
var cutsceneController = cutsceneCanvas.GetComponent<CutsceneController>();
cutsceneController.RunCutscene(cutscene, () => {
// Cutscene has ended. CutsceneCanvas will automatically deactivate. Open another panel, etc.
});
The CutsceneController
is the main API to interact with. Internally it uses a CutsceneQueue
. The CutsceneQueue
is just a runner for the Cutscene
and also accepts a CutsceneQueueContext
that should provide completion actions and can also provide coroutine start/stop functionality (provided by MonoBehaviour
).
The paged dialog support reuses the CutsceneQueue
. Within a CutsceneAction, dialog is split into N pages depending on how long it is (and how big the DialogText
game object is) and a queue of N actions is created. The next button fires an event that navigates to the next action in the internal queue.
Check out IntroCutscene.cs
to see how to set this up. Here is an example:
return new Cutscene() {
new ShowDialogAction(false),
new InstantiatePrefabAction("CutsceneSpaceship", "CutsceneSpaceship", Vector3.zero, Quaternion.identity),
new WaitAction(2),
new ShowDialogAction(true),
new DialogAction("This is a dialog test..."),
new DialogAction("Another dialog that runs automatically."),
new ShowDialogAction(false),
new DestroyObjectAction("CutsceneSpaceship")
};
Completion notification of a CutsceneQueue
can be provided through the CutsceneQueueContext
.
There are also completion notifications for individual CutsceneActions
.
When implementing your own CustceneActions
- just remember to call the finish()
Action parameter after your logic is finished in Run()
. finish()
is not automatically called - this is to support coroutines. See WaitAction
in CutsceneActions.cs
for an example.
CutscenePrefabs
is a Monobehaviour
that acts like a ResourceDictionary in XAML - attach your prefabs to it in the Inspector at edit-time (with unique IDs) so that they will be ready to load at runtime in the game. This is to avoid the slow performance of Resources.Load.
You can use the InstantiatePrefabAction
to load these into your cutscene:
var cutscene = new Cutscene() {
new InstantiatePrefabAction("CutsceneSpaceship", "CutsceneSpaceship", Vector3.zero, Quaternion.identity)
};
You only need a Text
within a Panel
in a Canvas
(see Basic Usage section above) to set this up. Next page button is optional.
ShowDialogAction(bool)
shows and hides thePanel
.DialogAction
adds text into the dialog panel and animates it, like old-school RPGs. Use thedialogTextSpeed
to control how fast it animates.- After the text has finished animating, the cutscene will run to the next
CutsceneAction
automatically. - The next page button allows you to skip to the next action (dialog action or otherwise) in the cutscene.
CutsceneController
will automatically split long text into several dialog pages. You can navigate to the next page with the next button.- Each
DialogPage
has a reading time that is computed based on the length of the text. SeeCutsceneController.DialogPage.cs
- Support for concurrent
CutsceneActions
- UnityPackage support
- Migrating tests into this package