Опиши классы в unity для создания диалогов
Для создания системы диалогов в Unity, вы можете создать несколько классов, чтобы управлять диалогами и их отображением.
Вот пример простых классов для этой цели:
- 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);
// Дополнительные действия после завершения диалога, например, активация игровой логики.
}
}
- Dialog.cs - Определяет структуру диалога.
[System.Serializable]
public class Dialog
{
public string[] sentences; // Массив предложений в диалоге.
}
- 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 используется для запуска диалога при взаимодействии с игровым объектом, например, при столкновении с ним.
А если диалог не линейный?
Если вы хотите реализовать нелинейные диалоги с разными ветвями и выборами, вам потребуется расширить структуру диалога и добавить логику обработки выборов. Вот обновленные классы для поддержки нелинейных диалогов:
- 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);
// Дополнительные действия после завершения диалога, если необходимо.
}
}
- Dialog.cs - Обновленная структура диалога с поддержкой выборов.
[System.Serializable]
public class Dialog
{
public string[] sentences; // Массив предложений в диалоге.
public DialogChoice[] choices; // Массив вариантов выбора.
}
[System.Serializable]
public class DialogChoice
{
public string text; // Текст выбора.
public Dialog dialog; // Диалог, который будет запущен при выборе этой опции.
}
Теперь вы можете добавлять в диалоги варианты выбора, и при выборе игроком опции будет отображаться соответствующий диалог. Это позволит вам создавать более интерактивные и нелинейные диалоги в вашей игре.