Progress Tracking

  1. Store ANY game event or action as a key
  2. Add unlimited sub-values per key
  3. Change dialogue based on keys
  4. Remember past dialogue choices
  5. Access & update inventory mid dialogue
  6. Access & update inventory during gameplay
  7. Keys double as a quest & inventory system

Load & Save Games

  1. Save the entire game’s variables in one line of code
  2. Retrieve an entire saved game’s values in one line of code
  3. Save and use variables of type string, int, long, float, Rect, Color, Vector2, Vector3, Quaternion and bool
  4. Save ANYTHING you can turn into a string!
  5. You can effectively use this as an in-memory database containing all your game’s data!

Extra Features

  1. Includes a prefab for playing audio
  2. Make characters speak random audio (i.e. Bored guards)
  3. Create custom GUIs for your game
  4. …without having to mod the engine source!
  5. Includes a number of pre-made GUI prefabs
  6. Includes a Visual Novel GUI and demo
  7. Free game templates available on this site!

And More…

  1. Step by step “Getting started” lessons included
  2. Runtime typed data creation
  3. GUI and Engine code run independently from one another
  4. 100% display agnostic. Works with ANY GUI system or it can just as easily be used completely without a GUI
  5. Fires events for you to hook into for extra customisation
  6. Includes “All at once” and “Typewriter” text display modes

Infinitely Expandable

  1. Highly customisable dialogue script format
  2. Add completely new features without touching the engine code!
  3. Dialogue script contains an Actor definition and Dialogue section
  4. Add as may extra sections as your custom GUI requires
  5. Add between 1 and infinite actors per dialogue
  6. Add between 1 and infinite dialogue turns per file
  7. Add between 0 and infinite requirements that have to be met before the turn is spoken or redireect to a new line based on which test failed
  8. Add between 0 and infinite inventory items to update per turn (Create, Add, Subtract, Set)
  9. Add between 0 and infinite additional fields per turn as your custom GUI requires
  10. Call between 0 and infinite custom functions you created
  11. Each custom function can have between 0 and infinite parameters
  12. Optionally name your parameters to access them by name inside your function(s)
  13. No 2 turns have to contain the same fields
  14. Some fields are auto generated and can be left out if you want to
  15. Includes 2 scripting formats
  16. Mix the 2 formats to suit your taste

DEMOS (Please be patient while demos load. Largest demo is 23Mb)


1 review for THE Dialogue Engine

  1. Rated 5 out of 5

    JBR-games on 2017-11-13 20:22:38

    Great Asset, with the ability to do much more. - If you need a npc chat setup for Unity this will do the job. Need your story to have multiple options this can handle it, Need your NPC to know if you picked up a "gold sword" from some other NPC this can handle it easy with out any code... This system also allows for much more like, quest tracking, quick saving features and even inventory. But you will need some coding knowledge if your doing anything fairly advanced. Publisher is very willing to help you out with any issues you may have via the forums or by email. Edit 11/13/2017 Just got a new update, works great with Unity 2017.2 ,also added a simple inventory system.


Please check back in soon...

Just to show you how easy this can be, here is a complete sample dialogue script for an NPC character

<Dialogue> //legacy node. Can be skipped

<turn> who=0; Good day, Sir

<turn> who=1; Good day to you, fair lady

<turn> Seeing your face always reminds me that I am home

<turn> who=0;


You are going to make me blush if you say things like that

<turn> who=1; We shall speak soon as I leave for my next adventure. Till then, my lady

<turn> who=0; next=-1; Good day, Sir.

<Actors> //legacy node. Can be skipped

<Actor>name=Mary Lou; avatar=HouseWife3

<Actor>name=Sir Lancelot; avatar=LancelotOnHorse1

Just to show you how complicated you can make it. Here is another, more involved dialogue script

Demonstrated here

  1. Remember in-game and in-dialogue actions
  2. The first turn starts the dialogue at one of 3 places depending on previous actions
  3. Normal dialogue text and multiple choice
  4. Localised to 2 languages. Follow the example and add as many as you want
  5. Inventory checks mid dialogue
  6. Inventory updates mid dialogue
  7. Game data fetching mid dialogue
  8. Redirecting to different parts of the dialogue based on requirements
  9. Redirecting to another line can cause redirection to other lines if that line’s requirements are not met
  10. Dynamic text substitution of either default of sub values of data
  11. Custom field used for occasional change of background
  12. All turns don’t require all fields
  13. Mix and match the two scripting formats
  14. Display one of multiple avatar images for same character based on what is being said
  15. Creating an unbeatable quest (by killing the knight)
  16. This quest can be solved by finding the princess outside of the dialogue. The dialogue is aware of your actions
  17. Skipping to post-quest dialogue on dialogue start if the quest is complete
  18. Calling your own custom functions and naming the variables you pass to your function


<Actor>name=Knight; avatar=KnightKneel1

<Actor>name=Knight; avatar=KnightKneel2

<Actor>name=Knight; avatar=KnightStand7

<Actor>name=King Colonius; avatar=King1 //who 3

<Actor>name=King Colonius; avatar=KingMad

<Actor>name=King Colonius; avatar=KingSad


<turn> id=0 ; next=1; who=1; Afrikaans=Ek was suksesvol in my avontuur, u hoogheid

[require] - PrincessFound 1 50, - DeadKnight 1 100, - Quest3 1 3


My king! I have returned from my adventure with tales of victory

<turn> id=1 ; next=2; who=3

[Afrikaans] Ons het nie nou tyd vir dit nie!\nRed my dogter van die draak!;

[keys] + Quest3 1

I'm glad to hear it but my daughter has been kidnapped

You need to ride out immediately!

Find the dragon! Save her!

<turn> id=2 ; next=-1; who=2; Afrikaans=; Ek is reeds op pad, U hoogheid!

I will leave at once your majesty!

<turn> id=3 ; next=4; who=3; Afrikaans= En? Kon jy haar red?


Have you found my daughter yet?

<turn> id=4 ; next=8,5; who=1; Afrikaans=Ek het, ja, my koning\nNog nie, my koning

I have her, your majesty!

I have yet to find her, your majesty

<turn> id=5 ; next=6; who=4; Afrikaans=Wel, gaan soek dan voort!

Well get back out there then!!!

<turn> id=6 ; next=-1; who=0; Afrikaans=Natuurlik, my koning

Of course, my king

<turn> id=7 ; next=6; who=4

[Afrikaans] As jy aanhou lieg gaan jy met jou lewe betaal!\nGaan soek haar!

[require] - Liar 3 99

[keys] + Liar 1

You lie! I see her not!

Speak not your lies to me again lest ye be put to death!

Find her!

<turn> id=8 ; next=9; who=5; Afrikaans=Ag, my engel! Ek is tog so bly jy is veilig!

[require] + Princess 1 7

[keys] - Princess 1, + PrincessFound 1

Oh my darling! I am so happy you are safe!

<turn> id=9 ; next=10; who=5; 

[Afrikaans]{:Player:Name}! Jy het vrye toegang tot my skatkamer!\nVat net wat jy wil!

[keys] - Quest3 1, + Gold 10000, + Rank 5, Sound name:QuestComplete loop:false

{:Player:Name}, you are hereby granted access to my treasury!

Take anything your heart desires!

<turn> id=10 ; next=-1; who=1; Afrikaans=Dankie, U hoogheid;

Thank you, your majesty

<turn> id=50; next=10; who=5;

[Afrikaans]Als is reg met die wêreld!\nGaan geniet jou {:Gold} goud!


My daughter is back and all is well!

Go enjoy your {:Gold} gold pieces!

<turn> id=99 ; next=100; who=4; Afrikaans=Iemand kap net asseblief sy kop vir my af!


Someone kill this lying disgrace!

<turn> id=100 ; next=-1; who=5; Afrikaans=Ag tog! Is daar niemand wat my kind kan red nie?


Oh woe is me.

Who will save my daughter from the beast?


  1. Minimum required version is now 2017.3
  2. Updated code to C#6
  3. Made the code compatible with the latest version of MBSCore
    1. Added the ability to do basic math on key values
    2. Updated CML to version 4 and updated the class names to go with it
    3. Added the MBSUtiliies class to the project. Please see the documentation for that to see what that adds to your project
    4. Added the MBSEvent class. Please see the documentation for that to see what that adds to your project
    5. Removed the custom UDEAEvent and UDEAEventHandler in favour of the updated MBSEvent and MBSEventHandler
  4. Replaced the custom Exception definitions with the generic Exception
  5. Simplified CMLGameKeys by making use of the updated features of CML4


  1. Fixed a compatibility issue with U5.5
  2. Updated outdated Editor script to not show meaningless errors all the time
  3. Fixed a bunch of errors in the demo dialogues
  4. Rearranged some folders


  1. Added a change log
  2. Added AutoContinueOnClick boolean to UDEA.
    Enable to continue the dialogue with a left click

    Disable to allow the UDEA to be used with NGUI/ UGUI / etc.

  3. Added CurrentSprite property alongside CurrentAvatar property. You can now fetch a Sprite or a Texture2D
  4. WhoIsSpeakingAvatar now first tries to load a Sprite and loads a Texture only if that fails
  5. Removed the use of the ProcessKeys function to handle custom keys
  6. Custom keys now directly calls any function you want. The first param of your key is the function name

    For example, a custom key “ChangeVolume BGSource 0.4” will send the params “BGSource” and “0.4” to a

    function called ChangeVolume

  7. Custom keys can now have any number of parameters or none at all. If using parameters they will be passed

    as a single CMLData object so be sure to create your functions like this: public void FuncX(CMLData data)

  8. Custom key’s parameters can now be prefixed with a descriptive name using the : seperator

    Example: [keys] ChangeVolume WhichItem:BGSource Volume:0.4 FadeSpeed:0.15, KeyWithNoParams

    Parameters without names are accessed in the order they are declared, ignoring named parameters before it

    Paramteres with names are accessed by name and can be converted to it’s relevant type


    Using key "ChangeVolume BGSource, Volume: 0.4, 0.15" with function: FuncX(CMLData fields)
    string bgSource =[0]; <-- accessed via data array. First entry
    float volume = fields.Float("volume"); <-- accessed by name. Converted to type
    float fadespeed = float.Parse([1] ); <-- second entry in data array. Value returned as string
  9. Added UGUI display prefabs
  10. Removed old OnGUI displays and prefabs
  11. Now require that the dialogue be parented to a canvas, no longer simply run directly on random objects
  12. Added BroadcastToSelf boolean to UDEA to allow you to send keys to a target object and to the display script sending it
  13. Dialogue prefabs are now destroyed instead of disabled so there is now a difference in implementation
  14. Removed “Parent” property from the UDEA class as it was just a duplicate of the public “parent” variable
  15. Removed redundant OpenFile and StartDialogue methods
  16. Changed CurrentIsChoice function to look at number of redirect values, rather than implicit “choice” value
  17. Removed the need to add “choice=true” in dialogue scripts. This is now completely redundant
  18. Made the OnSpeakStart, OnSpeakEnd, OnTypewriterModeUpdate and OnSelectionChange events local events, not static
  19. Removed the legacy Actions HUD product from THE Dialogue Engine.
  20. Fixed a bug with WhoIsSpeakingName if called after the dialogue contents were cleared
  21. Added an Audio system to THE Dialogue Engine. Just drag the audio prefab onto an object, add some clips to it and you

    can now play audio right from your dialogue. Simply add the key “PlaySound track:trackname” where

    trackname is the name of a track you added to the prefab. Alternatively you can also use “PlaySound index:x”

    where x is the array index of a clip you added to the prefab.

    You can also add in “loop:true” or “loop:false” if you want. i.e. “PlaySound track:help loop:false”

  22. Added a barking system. Use the same audio system and add the sentences you want the character to speak

    Simply tick the “random_barks” box and specify the min and max wait time between random barks. Primarily used

    to make guards say random stuff, in the demo I use it to play random electrical beeps and crackles on the

    damaged robot. Turn this barks system on or off during dialogues using “DisableRandomBarks” or “EnableRandomBarks”

  23. For the sake of the Visual Novel prefab I also added a number of custom fields to THE Dialogue Engine dialogue format

    More info on these fields can be found in the relevant documentation

  24. For the sake of the Visual Novel prefab I also added a number of custom functions that can be triggered either

    from the dialogue or from script directly. More info on these fields can be found in the relevant documentation

  25. Added a lot more documentation to THE Dialogue Engine explaining it in far more detail than before


Please check back in soon...