Для начала код.
Dilog:
using UnityEngine;
[System.Serializable]
public class Dialog
{
public string[] name;
public Sprite[] head;
public float[] timeOccurrencea;
[TextArea(3, 10)]
public string[] sentences;
}
DialogTrigger:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DialogTrigger : MonoBehaviour
{
public Dialog dialog;
private void TriggerDialogue()
{
FindAnyObjectByType<DialogManager>().StartDialogue(dialog);
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
TriggerDialogue();
Destroy(this.gameObject);
}
}
}
DialogManager:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DialogManager : MonoBehaviour
{
public Text DialogText;
public Text NameText;
public Image HeadImage;
private float timeOccurrence;
public Queue<string> Setences;
public Queue<string> Name;
public Queue<Sprite> Head;
public Queue<float> TimeLetterOccurrence;
public Animator animator;
private void Start()
{
Setences = new Queue<string>();
Name = new Queue<string>();
Head = new Queue<Sprite>();
TimeLetterOccurrence = new Queue<float>();
}
public void StartDialogue(Dialog dialog)
{
Debug.Log("Start Dialog");
animator.SetBool("isStart", true);
//animator.SetBool("isOpen", true);
Setences.Clear();
Name.Clear();
Head.Clear();
foreach (Sprite head in dialog.head)
{
Head.Enqueue(head);
}
foreach (string name in dialog.name)
{
Name.Enqueue(name);
}
foreach (string setences in dialog.sentences)
{
Setences.Enqueue(setences);
}
foreach (float letterOccurrence in dialog.timeOccurrencea)
{
TimeLetterOccurrence.Enqueue(letterOccurrence);
}
DisplayNextSetences();
}
private void DisplayNextSetences()
{
string setence = Setences.Dequeue();
string name = Name.Dequeue();
Sprite head = Head.Dequeue();
float timeOccerences = TimeLetterOccurrence.Dequeue();
StartCoroutine(TypeSetences(setence, name, head, timeOccerences));
}
private void Update()
{
if (Input.GetKey(KeyCode.H))
{
DisplayNextSetences();
}
}
IEnumerator TypeSetences(string setence, string name, Sprite head, float time)
{
DialogText.text = "";
NameText.text = name;
HeadImage.sprite = head;
timeOccurrence = time;
Debug.Log($"Говорит {name}");
foreach (char letter in setence.ToCharArray())
{
DialogText.text += letter;
yield return new WaitForSeconds(timeOccurrence);
}
}
}
Проблема заключается в том, что если в инспекторе больше 2-х элементов, то текст 2 элемента некорректно отображается, а текст следующих элементов, не выводится, так же и с картинками.
Как выглядит инспектор с 2-мя элементами:
Вот как выглядит такой диалог:
Как выглядит инспектор с 3-мя элементами:
Вот как выглядит такой диалог:
P.S. Пока делал скрины, у меня 2 раза вывелось все нормально, но потом опять проблема.