Диалоговая система с ключами на Unity
- Создаете пустой объект и добавляете скрипт "DialogueManager".
- Нажимаете на плюсик и у вас появиться 2 поля, ключ и объект.
- В поле ключ пишем строку, по которой будете обращаться для начала диалога.
- Создаете новый объект с которым будет происходить диалог и добавляете скрипт "Dialogue_".
- В поле объекта оставляете ссылку на этот объект.
- Готово!
- Обращаетесь к скрипту через Instance
- Вызываете метод
StartDialogueByKey
DialogueManager.Instance.StartDialogueByKey(key)
В самом начале иницилизируем базу данных (все диалоги, которые вы ввели в инспекторе)
private void InitializeDialogueDataBase()
{
// Перед заполнением на всякий случай очищаем нашу базу данных
dialogueDataBase.Clear();
// Заполняем dialogueDataBase ключами и значениями которые мы укажем в листе dialogues
for (int i = 0; i < dialogues.Count; i++)
{
dialogueDataBase.Add(dialogues[i].key, dialogues[i].dialogueObj);
}
}- Проверяем есть ли диалог с ключом key в базе данных
- Если его нет - выводим соответсвующее сообщение
- Иначе обращаемся к компоненту
Dialogue_у объекта с диалогом и начинаем диалог
public void StartDialogueByKey(string key)
{
if (!dialogueDataBase.ContainsKey(key))
{
Debug.LogError($"диалога c ключом \"{key}\" нету в dialogueDataBase");
return;
}
activeDialogue = dialogueDataBase[key];
// запускаем с нашим ключом
dialogueDataBase[key].GetComponent<Dialogue_>().StartDialogue();
}- Активируем окно диалога
- Если напечатали уже все предложения:
- Заканчиваем диалог
- Помечаем isDialogueActive как
True - Печатаем 1-ое предлоежение
public void StartDialogue()
{
if (i + 1 > sentences.Length)
{
EndDialogue();
return;
}
dialogueBox.SetActive(true);
isDialogueActive = true;
if (!isTypingSentence)
StartCoroutine(TypeSentence(sentences[i]));
isTypingSentence = true;
}- Update
- Если есть активный диалог и не печатается текущее предложение
- Продолжаем диалог
- Если есть активный диалог и не печатается текущее предложение
- ContinueDialogue
- Если написали все предложения в диалоге - заканчиваем его
- Иначе печатаем следующее
private void Update()
{
if (isDialogueActive && !isTypingSentence)
{
if (Input.GetKeyDown(KeyCode.E))
ContinueDialogue();
}
}
public void ContinueDialogue()
{
if (i + 1 < sentences.Length)
{
i++;
isTypingSentence = true;
StartCoroutine(TypeSentence(sentences[i]));
}
else
{
EndDialogue();
}
}Если у нас воспроизводится диалог:
- Заканчиваем его обращаясь к компоненту
Dialogue_объекта, с которым сейчас разговариваем - Говорим, что
activeDialogue = null
public void EndDialogueByKey()
{
if (activeDialogue != null)
{
activeDialogue.gameObject.GetComponent<Dialogue_>().EndDialogue();
activeDialogue = null;
}
}- Скрываем курсор
- Скрываем окно диалога
public void EndDialogue()
{
Cursor.lockState = CursorLockMode.Locked;
dialogueBox.SetActive(false);
}- Проходимся посимвольно по всей встроке
- Добавяем в пустую строку 1 символ и ждем 0.01 секунду, чтобы получилась анимация появления букв
IEnumerator TypeSentence(string sentence)
{
if (name_speaker != "")
dialogueText.text = name_speaker + ": ";
else
dialogueText.text = "";
foreach (char letter in sentence.ToCharArray())
{
dialogueText.text += letter;
yield return new WaitForSeconds(0.01f);
}
isTypingSentence = false;
}