97.8335
105.451
11.11.2024
07:32:29

Опиши классы в unity для создания диалогов

Для создания системы диалогов в Unity, вы можете создать несколько классов, чтобы управлять диалогами и их отображением.

Вот пример простых классов для этой цели:

  1. DialogManager.cs - Управляет потоком диалога и его отображением.

using UnityEngine;
using UnityEngine.UI;

public class DialogManager : MonoBehaviour
{
  public Text dialogText; // Ссылка на текстовый элемент для отображения диалога.
  public GameObject dialogBox; // Ссылка на панель для диалогового окна.

  private Queue sentences; // Очередь предложений диалога.

  private void Start()
  {
    sentences = new Queue();
  }

  public void StartDialog(Dialog dialog)
  {
    sentences.Clear();

    foreach (string sentence in dialog.sentences)
    {
      sentences.Enqueue(sentence);
    }

    DisplayNextSentence();
  }

  public void DisplayNextSentence()
  {
    if (sentences.Count == 0)
    {
      EndDialog();
      return;
    }

    string sentence = sentences.Dequeue();
    dialogText.text = sentence;
  }

  private void EndDialog()
  {
    dialogBox.SetActive(false);
    // Дополнительные действия после завершения диалога, например, активация игровой логики.
  }
}

  1. Dialog.cs - Определяет структуру диалога.

[System.Serializable]
public class Dialog
{
  public string[] sentences; // Массив предложений в диалоге.
}

  1. DialogTrigger.cs - Запускает диалог при взаимодействии игрока с объектом.

using UnityEngine;

public class DialogTrigger : MonoBehaviour
{
  public Dialog dialog; // Диалог для воспроизведения.

  public void TriggerDialog()
  {
    FindObjectOfType().StartDialog(dialog);
  }

  private void OnTriggerEnter2D(Collider2D collision)
  {
    if (collision.CompareTag("Player"))
    {
      TriggerDialog();
    }
  }
}

Вы можете применить эти классы к объектам в вашей игре. DialogManager управляет отображением диалогового окна и потоком диалога. Dialog определяет структуру диалога, а DialogTrigger используется для запуска диалога при взаимодействии с игровым объектом, например, при столкновении с ним.

А если диалог не линейный?

Если вы хотите реализовать нелинейные диалоги с разными ветвями и выборами, вам потребуется расширить структуру диалога и добавить логику обработки выборов. Вот обновленные классы для поддержки нелинейных диалогов:

  1. DialogManager.cs - Управляет потоком диалога, включая обработку выборов.

using UnityEngine;
using UnityEngine.UI;

public class DialogManager : MonoBehaviour
{
  public Text dialogText;    // Текстовый элемент для отображения диалога.
  public GameObject dialogBox; // Панель для диалогового окна.

  private Dialog currentDialog;   // Текущий диалог.
  private int currentSentenceIndex; // Индекс текущего предложения в диалоге.

  // Запуск диалога.
  public void StartDialog(Dialog dialog)
  {
    currentDialog = dialog;
    currentSentenceIndex = 0;
    DisplaySentence(); // Начать с первого предложения.
  }

  // Отображение текущего предложения.
  public void DisplaySentence()
  {
    if (currentDialog == null)
    {
      EndDialog();
      return;
    }

    if (currentSentenceIndex < currentDialog.sentences.Length)
    {
      string sentence = currentDialog.sentences[currentSentenceIndex];
      dialogText.text = sentence;
      currentSentenceIndex++;
    }
    else
    {
      // Если предложения закончились, показать варианты выбора (если есть).
      DisplayChoices();
    }
  }

  // Отображение вариантов выбора.
  public void DisplayChoices()
  {
    // Очистить текущий текст и показать варианты выбора, если они есть.
    dialogText.text = "";

    if (currentDialog.choices != null && currentDialog.choices.Length > 0)
    {
      for (int i = 0; i < currentDialog.choices.Length; i++)
      {
        // Отображение текста для каждого варианта выбора.
        string choiceText = $"{i + 1}. {currentDialog.choices[i].text}";
        dialogText.text += choiceText + "\n";
      }
    }
  }

  // Выбор опции.
  public void MakeChoice(int choiceIndex)
  {
    if (currentDialog != null && currentDialog.choices != null && choiceIndex >= 0 && choiceIndex < currentDialog.choices.Length)
    {
      DialogChoice chosenChoice = currentDialog.choices[choiceIndex];
      currentDialog = chosenChoice.dialog;
      currentSentenceIndex = 0;
      DisplaySentence(); // Перейти к выбранному диалогу.
    }
  }

  // Завершение диалога.
  private void EndDialog()
  {
    dialogBox.SetActive(false);
    // Дополнительные действия после завершения диалога, если необходимо.
  }
}

  1. Dialog.cs - Обновленная структура диалога с поддержкой выборов.

[System.Serializable]
public class Dialog
{
  public string[] sentences; // Массив предложений в диалоге.
  public DialogChoice[] choices; // Массив вариантов выбора.
}

[System.Serializable]
public class DialogChoice
{
  public string text;   // Текст выбора.
  public Dialog dialog;  // Диалог, который будет запущен при выборе этой опции.
}

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

28.09.2023 01:39

Лента статей

Наверх