Система діалогу для єдності

Система діалогу в games ​​— це механізм, який дозволяє вести інтерактивні та захоплюючі розмови між гравцем і персонажами в ігровому світі. Він служить каналом зв’язку, за допомогою якого гравці можуть спілкуватися з неігровими персонажами (NPC) або іншими сутностями, надаючи засоби для оповідання історій, проходження квестів, розвитку персонажів і побудови світу.

Основна мета діалогової системи — створити динамічний і захоплюючий досвід для гравців, дозволяючи їм робити вибір, впливати на розповідь гри та формувати свої стосунки з персонажами в грі. Добре продумана система діалогу може покращити занурення гравця, емоційне вкладення та відтворення.

Коли йдеться про розробку ігор у Unity, створення повноцінної діалогової системи з нуля може бути досить великим, але можна почати зі спрощеного прикладу. Наведений нижче приклад охоплює базову систему текстового діалогу з використанням C# і системи Unity UI. Пам’ятайте, що це лише початкова точка, яку можна розширити та налаштувати відповідно до конкретних потреб.

Створіть менеджер діалогів

  • Створіть новий сценарій, назвіть його "DialogueManager", а потім вставте в нього наведений нижче код:
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;
    }
}

Щоб налаштувати об’єкти UI Text і Button у Unity для сценарію DialogueManager, виконайте наведені нижче дії.

  • У редакторі Unity клацніть правою кнопкою миші вікно ієрархії та виберіть "UI -> Text", щоб створити новий об’єкт UI Text.
  • Перейменуйте об’єкт UI Text на "DialogueText."
  • Так само створіть три об’єкти кнопки інтерфейсу користувача: один для вибору 1, один для вибору 2 і один для кнопки "Next" (для просування діалогу).
  • Назвіть кнопки "Choice1Button," "Choice2Button," і "NextButton" відповідно.
  • Розмістіть текст інтерфейсу користувача та кнопки на полотні відповідно до бажаного макета. Ви можете розмістити текст інтерфейсу користувача в центрі екрана, а кнопки – під текстовим полем.
  • Налаштуйте шрифт, розмір, колір та інші властивості тексту інтерфейсу користувача відповідно до візуального стилю гри.
  • Налаштуйте зовнішній вигляд кнопок інтерфейсу користувача, наприклад змініть їхні кольори та текстові мітки.
  • У редакторі Unity виберіть "DialogueManager" GameObject (той, який ви створили, щоб прикріпити сценарій).
  • У вікні інспектора ви побачите компонент сценарію "Dialogue Manager". Перетягніть об’єкти «Текст» і «Кнопка» з вікна «Ієрархія» у відповідні публічні поля в компоненті сценарію.
  • Призначаючи ці посилання, сценарій DialogueManager може отримати доступ до тексту інтерфейсу користувача та кнопок у сцені, дозволяючи йому оновлювати текстовий вміст і контролювати їх видимість за потреби під час діалогу.
  • Збережіть сцену, щоб зберегти зміни змінних.

Під час запуску гри або взаємодії з тригерами діалогу DialogueManager повинен мати можливість відображати текст діалогу та варіанти вибору за допомогою посилань на елементи інтерфейсу користувача на полотні.

Висновок

Ефективна система діалогу в іграх надає гравцям свободу волі, вплив і відчуття причетності до віртуального світу, роблячи ігровий досвід багатшим і привабливішим. Оскільки ігрові наративи та інтерактивне оповідання стають все більш витонченими, системи діалогу відіграють все більш важливу роль у формуванні подорожі гравця та створенні незабутніх ігрових вражень.

Рекомендовані статті
Контролер вертольота для Unity
Автомобільний контролер для Unity
Контролер літака для Unity
Посібник із 3D- і 2D-стрибків у стіну гравця для Unity
Навчальний посібник із 3D-контролера Worm для Unity
Планетарний контролер гравця для Unity на основі жорсткого корпусу
Посібник з контролера програвача згори вниз для Unity