你好,这是问题所在。我有一个包含精灵的数组,我需要在 UI 画布中迭代和显示精灵,我不明白为什么 Unity 会这样抱怨:

大批:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[CreateAssetMenu(menuName ="Dialogue/DialogueObject")]
public class DialogueObject : ScriptableObject
{
[SerializeField] [TextArea] private string nameChar;
[SerializeField] private Sprite[] imgObj;
[SerializeField] [TextArea] private string[] dialogue;
[SerializeField] private Response[] responses;
public Sprite[] ImgObj => imgObj;
public string NameChar => nameChar;
public string[] Dialogue => dialogue;
public bool HasResponses => Responses != null && Responses.Length > 0;
public Response[] Responses => responses;
}
这是我尝试显示图像的代码:
using UnityEngine;
using TMPro;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class DialogueUI : MonoBehaviour
{
[SerializeField] private GameObject dialogueBox;
[SerializeField] private TMP_Text textLable;
[SerializeField] private TMP_Text textName;
[SerializeField] private Image imgHandler;
public bool IsOpen {get; private set;}
private ResponseHandler responseHandler;
private TypeWriterEffect typeWriterEffect;
private void Start() {
typeWriterEffect=GetComponent<TypeWriterEffect>();
responseHandler = GetComponent<ResponseHandler>();
imgHandler = GetComponent<Image>();
CloseDialogueBox();
}
public void ShowDialogue(DialogueObject dialogueObject){
IsOpen = true;
dialogueBox.SetActive(true);
string nameChar = dialogueObject.NameChar;
textName.text = nameChar;
StartCoroutine(StepTroughtDialogue(dialogueObject));
StartCoroutine (ImgInDialogue(dialogueObject));
}
public void AddResponseEvents(ResponseEvent[] responseEvents){
responseHandler.AddResponseEvents(responseEvents);
}
private IEnumerator ImgInDialogue(DialogueObject dialogueObject){
for (int i = 0; i < dialogueObject.ImgObj.Length; i++ ){
Sprite imgObj = dialogueObject.ImgObj[i];
imgHandler.sprite = imgObj;
yield return null;
yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space));
}
}
private IEnumerator StepTroughtDialogue(DialogueObject dialogueObject){
for (int i = 0; i < dialogueObject.Dialogue.Length; i++ ){
string dialogue = dialogueObject.Dialogue[i];
yield return RunTypingEffect(dialogue);
textLable.text = dialogue;
if (i == dialogueObject.Dialogue.Length - 1 && dialogueObject.HasResponses) break;
yield return null;
yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space));
}
if (dialogueObject.HasResponses)
{
responseHandler.ShowResponses(dialogueObject.Responses);
}
else
{
CloseDialogueBox();
}
}
private IEnumerator RunTypingEffect(string dialogue){
typeWriterEffect.Run(dialogue, textLable);
while (typeWriterEffect.IsRunning){
yield return null;
if (Input.GetKeyDown(KeyCode.Space)){
typeWriterEffect.Stop();
}
}
}
public void CloseDialogueBox(){
IsOpen = false;
dialogueBox.SetActive(false);
textName.text=string.Empty;
textLable.text=string.Empty;
}
}
数组有些混乱。如果我们已经开始的话,让我们使用 OOP。
我会用纯C#编写
这是对话的示例角色
那么对话短语将如下所示:
现在在某个地方你需要有一组短语
易于使用,例如
让我们开始建立对话
现在一切都在一个数组中。
咀嚼所有内容的协程看起来像这样。
就这样。现在你不必强迫所有这些美丽一起工作,因为它最初是一个整体。
剩下的就是添加类,以便在 Unity 中使用方便。
复杂的对话,例如,玩家将做出决定、选择答案等。是通过有限机器实现的。您需要构建一个短语树而不是数组,如下所示:
问题是在检查器中选择了一个对象,并且我还尝试通过 getcomponent 在代码中捕获它
因此,您只需从代码中删除 getcomponent 行
好吧,该对象在启动时崩溃并给出了 NullReferenceException 错误