没有开始按钮的Brackeys对话(统一)

时间:2019-02-01 14:59:38

标签: c# unity3d

我已经按照Brackeys教程开发了一个对话系统,但是我不想在Unity中使用“开始”按钮,因此文本应该单独开始。有人可以帮我编写脚本吗?我已经尝试了好几个小时,但无法正常工作。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class DialogTrigger : MonoBehaviour
    {

        public Dialog dialog;

        public void TriggerDialogue()
        {
            FindObjectOfType<DialogManager>().StartDialog(dialog);
        }

    }
  

Blockquote

using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    public class DialogManager : MonoBehaviour
    {
        public float delay;
        public Text nameText;
        public Text dialogueText;



        private Queue<string> sentences;

        // Use this for initialization
        void Start()
        {
            sentences = new Queue<string>();
        }

        public void StartDialog(Dialog dialog)
        {


            nameText.text = dialog.name;

            sentences.Clear();

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

            DisplayNextSentence();
        }

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

            string sentence = sentences.Dequeue();
            StopAllCoroutines();
            StartCoroutine(TypeSentence(sentence));
        }

        IEnumerator TypeSentence(string sentence)
        {
            dialogueText.text = "";
            foreach (char letter in sentence.ToCharArray())
            {
                dialogueText.text += letter;
                yield return new WaitForSeconds(delay);
            }
        }

        void EndDialogue()
        {
            SceneManager.LoadScene(1);
        }

    }

我找到了要在void start中写的注释,但它不起作用,并且在对撞机上也不起作用。

2 个答案:

答案 0 :(得分:1)

DialogueManager应该在Queue的{​​{1}}界中设置其Awake()

Start()

然后public class DialogManager : MonoBehaviour { private void Awake() { sentences = new Queue<string>(); } 可以从其DialogTrigger安全地呼叫TriggerDialogue()

Start()

加载场景时,所有脚本都运行其public class DialogTrigger : MonoBehaviour { private void Start() { TriggerDialogue(); } 方法(如果有),然后所有启用的脚本都运行其Awake()方法。


您还可以选择在声明它的同一行中初始化Start()

Queue

然后该类不需要public class DialogManager : MonoBehaviour { private Queue<string> sentences = new Queue<string>(); Awake()方法,并且Start()总是可以安全地调用它。

答案 1 :(得分:1)

@Foggzie的方法确实有效!对于遭受“空引用”问题困扰的用户,请确保如果您已更改脚本文件的名称(在我的情况下,我将其更改为“ DialogueManagerAwake”)

您在DialogueTrigger中更改名称: FindObjectOfType<DialogueManager>().StartDialogue(dialogue);

FindObjectOfType<DialogueManagerAwake>().StartDialogue(dialogue);

那么您将摆脱这个问题!