@Ebolik2

Как решить проблему с диалогами?

Для начала код.

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-мя элементами:
645111f520597835000304.png

Вот как выглядит такой диалог:
6451126883d53793518754.png
6451128e23b66844508641.png

Как выглядит инспектор с 3-мя элементами:
645112fd66bd6499299474.png

Вот как выглядит такой диалог:
6451126883d53793518754.png
64511615ca7cc063361005.png

P.S. Пока делал скрины, у меня 2 раза вывелось все нормально, но потом опять проблема.
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
GavriKos
@GavriKos Куратор тега Unity
Input.GetKey(KeyCode.H)

Вот тут проблема. Используй GetKeyDown. GetKey проверяет, не просто была ли нажата кнопка, а и удержание - у тебюя просто в двух апдейтах оно срабатывает и перескакивает
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы