我已经按照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中写的注释,但它不起作用,并且在对撞机上也不起作用。
答案 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);
那么您将摆脱这个问题!