Dialogue System for Unity

A dialogue system in games is a mechanism that allows for interactive and immersive conversations between the player and characters within the game world. It serves as a communication channel through which players can engage with non-player characters (NPCs) or other entities, providing a means for storytelling, quest progression, character development, and world-building.

The primary goal of a dialogue system is to create a dynamic and engaging experience for players by enabling them to make choices, influence the game's narrative, and shape their relationships with in-game characters. A well-designed dialogue system can enhance player immersion, emotional investment, and replayability.

When it comes to game development in Unity, creating a full-fledged dialogue system from scratch can be quite extensive, but it's possible to start with a simplified example to get started. The example below will cover a basic text-based dialogue system using C# and the Unity UI system. Remember that this is just a starting point, and can be expanded and customized based on the specific needs.

Create the Dialogue Manager

  • Create a new script, call it "DialogueManager", then paste the code below inside it:
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class DialogueManager : MonoBehaviour
{
    public Text dialogueText;
    public Button choice1Button;
    public Button choice2Button;
    public Button nextButton;

    private Dialogue currentDialogue;
    private int currentLineIndex = 0;

    void Start()
    {
        // You can load your dialogue data from an external source (e.g., JSON, XML) or create it programmatically.
        // For simplicity, we'll create a sample dialogue here.
        currentDialogue = CreateSampleDialogue();

        // Set up event listeners for buttons
        choice1Button.onClick.AddListener(OnChoice1Selected);
        choice2Button.onClick.AddListener(OnChoice2Selected);
        nextButton.onClick.AddListener(OnNextButtonClicked);

        // Start the dialogue
        StartDialogue();
    }

    private void StartDialogue()
    {
        currentLineIndex = 0;
        DisplayLine(currentDialogue.lines[currentLineIndex]);
    }

    private void DisplayLine(DialogueLine line)
    {
        dialogueText.text = line.text;
        choice1Button.gameObject.SetActive(line.hasChoice);
        choice2Button.gameObject.SetActive(line.hasChoice);
        nextButton.gameObject.SetActive(!line.hasChoice);
    }

    private void OnNextButtonClicked()
    {
        currentLineIndex++;
        if (currentLineIndex < currentDialogue.lines.Length)
        {
            DisplayLine(currentDialogue.lines[currentLineIndex]);
        }
        else
        {
            // Dialogue is over
            EndDialogue();
        }
    }

    private void OnChoice1Selected()
    {
        HandleChoice(currentDialogue.lines[currentLineIndex].choice1);
    }

    private void OnChoice2Selected()
    {
        HandleChoice(currentDialogue.lines[currentLineIndex].choice2);
    }

    private void HandleChoice(Choice choice)
    {
        // Handle the chosen choice (e.g., change variables, trigger events)
        Debug.Log("Selected Choice: " + choice.text);

        // Advance to the next line
        currentLineIndex++;
        DisplayLine(currentDialogue.lines[currentLineIndex]);
    }

    private void EndDialogue()
    {
        // Reset the dialogue UI or close the dialogue box
        Debug.Log("End of Dialogue");
    }

    // Sample dialogue data (you can replace this with loading from an external source)
    private Dialogue CreateSampleDialogue()
    {
        Dialogue dialogue = new Dialogue();

        dialogue.lines = new DialogueLine[]
        {
            new DialogueLine("Hello there! Welcome to the Unity dialogue system example.", false),
            new DialogueLine("What would you like to do?", true, new Choice("Go on an adventure"), new Choice("Stay here")),
            new DialogueLine("Great choice! Have a fantastic adventure!", false),
            new DialogueLine("That's okay. Sometimes staying in one place can be just as exciting!", false),
            new DialogueLine("Thanks for trying out the Unity dialogue system example!", false)
        };

        return dialogue;
    }
}

[System.Serializable]
public class Dialogue
{
    public DialogueLine[] lines;
}

[System.Serializable]
public class DialogueLine
{
    public string text;
    public bool hasChoice;
    public Choice choice1;
    public Choice choice2;

    public DialogueLine(string text, bool hasChoice, Choice choice1 = null, Choice choice2 = null)
    {
        this.text = text;
        this.hasChoice = hasChoice;
        this.choice1 = choice1;
        this.choice2 = choice2;
    }
}

[System.Serializable]
public class Choice
{
    public string text;

    public Choice(string text)
    {
        this.text = text;
    }
}

To set up the UI Text and Button objects in Unity for the DialogueManager script, follow the steps below:

  • In the Unity editor, right-click in the Hierarchy window and select "UI -> Text" to create a new UI Text object.
  • Rename the UI Text object to "DialogueText."
  • Similarly, create three UI Button objects: one for Choice 1, one for Choice 2, and one for the "Next" button (for advancing the dialogue).
  • Name the buttons as "Choice1Button," "Choice2Button," and "NextButton" respectively.
  • Position the UI Text and Buttons on the canvas according to your preferred layout. You might want to place the UI Text at the center of the screen and the buttons below the text box.
  • Adjust the text font, size, color, and other properties of the UI Text to fit your game's visual style.
  • Customize the appearance of the UI Buttons, such as changing their colors and text labels.
  • In the Unity editor, select the "DialogueManager" GameObject (the one you created to attach the script).
  • In the Inspector window, you will see the "Dialogue Manager" script component. Drag and drop the UI Text and Button objects from the Hierarchy window to the corresponding public fields in the script component.
  • By assigning these references, the DialogueManager script can access the UI Text and Buttons in the scene, allowing it to update the text content and control their visibility as needed during the dialogue.
  • Save the scene to save the variable changes.

When running the game or interacting with the dialogue triggers, the DialogueManager should be able to display the dialogue text and choices using the referenced UI elements on the canvas.

Conclusion

An effective dialogue system in games provides players with agency, impact, and a sense of involvement in the virtual world, making the gaming experience richer and more engaging. As game narratives and interactive storytelling become more sophisticated, dialogue systems play an increasingly vital role in shaping the player's journey and creating memorable gaming experiences.

Suggested Articles
Car Controller for Unity
Implementing Parkour System in Unity
Helicopter Controller for Unity
How to Make Crane Control in Unity
Airplane Controller for Unity
Player 3D and 2D Wall Jump Tutorial for Unity
Flashlight Tutorial for Unity