如何在循环中包括所有对话,但避免索引外的异常?

时间:2019-03-28 12:38:06

标签: c# unity3d

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

public class DialogueTrigger : MonoBehaviour
{
    public Dialogue[] dialogue;

    private int dialogueNum = 0;
    public void TriggerDialogue()
    {
        if (FindObjectOfType<DialogueManager>() != null)
        {
            FindObjectOfType<DialogueManager>().StartDialogue(dialogue[dialogueNum]);
        }
    }

    private void Update()
    {
        if (DialogueManager.dialogueEnded == true)
        {
            if (dialogueNum == dialogue.Length)
            {
                return;
            }
            else
            {
                dialogueNum += 1;
                FindObjectOfType<DialogueManager>().StartDialogue(dialogue[dialogueNum]);
            }
        }
    }
}

例如,如果我在数组中有3个对话,它将进行第一个对话,然后将引发异常IndexOutOfRangeException:Index在数组的边界之外,然后将进行最后一个对话。

如果要在条件检查中添加-1:

if (dialogueNum == dialogue.Length - 1)

然后它将不会引发异常,而只会执行第一个对话,而不会进行第二个对话。

也许最好将它放在StartCoroutine中而不是在Update中?使用public int数组来决定每次对话之间要等待多少时间?

我想添加int数组变量,以便能够确定每次对话之间要等待的时间。例如,对话0和对话1之间等待一秒钟,对话1和对话2之间等待5秒。

1 个答案:

答案 0 :(得分:1)

就像在StartDialogue调用之后移动对白Num + = 1一样简单:

private void Update()
{
    if (DialogueManager.dialogueEnded == true)
    {
        // Lets assume dialogueNum is in the last index, dialogueNum = 2
        // So dialogueNum == dialogue.Length is false
        if (dialogueNum == dialogue.Length) // THIS IS FALSE
        {
            return;
        }
        else
        {
            // If dialogueNum +=1 was here, dialogueNum would have been 3
            FindObjectOfType<DialogueManager>tartDialogue(dialogue[dialogueNum]);
            // Then we try to get the element at index 3 and get the out of index exception

            dialogueNum += 1; // MOVE dialogueNum += 1 HERE!
        }
    }
}