Диалоговая система для единства

Диалоговая система в 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;
    }
}

Чтобы настроить объекты «Текст пользовательского интерфейса» и «Кнопка» в Unity для сценария DialogueManager, выполните следующие действия:

  • В редакторе Unity щелкните правой кнопкой мыши окно «Иерархия» и выберите "UI -> Text", чтобы создать новый текстовый объект пользовательского интерфейса.
  • Переименуйте текстовый объект пользовательского интерфейса в "DialogueText."
  • Аналогичным образом создайте три объекта «Кнопка пользовательского интерфейса»: один для варианта 1, один для варианта 2 и один для кнопки "Next" (для продвижения диалога).
  • Назовите кнопки "Choice1Button,", "Choice2Button," и "NextButton" соответственно.
  • Расположите текст пользовательского интерфейса и кнопки на холсте в соответствии с предпочитаемым вами макетом. Возможно, вы захотите разместить текст пользовательского интерфейса в центре экрана, а кнопки — под текстовым полем.
  • Настройте шрифт, размер, цвет и другие свойства текста пользовательского интерфейса в соответствии с визуальным стилем вашей игры.
  • Настройте внешний вид кнопок пользовательского интерфейса, например изменив их цвета и текстовые метки.
  • В редакторе Unity выберите игровой объект "DialogueManager" (тот, который вы создали для присоединения сценария).
  • В окне инспектора вы увидите компонент сценария "Dialogue Manager". Перетащите объекты «Текст пользовательского интерфейса» и «Кнопка» из окна «Иерархия» в соответствующие общедоступные поля компонента скрипта.
  • Назначив эти ссылки, сценарий DialogueManager может получить доступ к тексту и кнопкам пользовательского интерфейса на сцене, что позволяет ему обновлять текстовое содержимое и управлять их видимостью по мере необходимости во время диалога.
  • Сохраните сцену, чтобы сохранить изменения переменных.

При запуске игры или взаимодействии с триггерами диалога DialogueManager должен иметь возможность отображать текст диалога и варианты выбора, используя указанные элементы пользовательского интерфейса на холсте.

Заключение

Эффективная система диалога в играх дает игрокам свободу действий, влияние и чувство причастности к виртуальному миру, делая игровой процесс богаче и увлекательнее. По мере того, как игровые повествования и интерактивное повествование становятся все более сложными, диалоговые системы играют все более важную роль в формировании путешествия игрока и создании запоминающихся игровых впечатлений.

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