我正在Unity中制作幻灯片。我有2个场景,每个场景都设置有完整的图像阵列。当我按下向右箭头键时,我可以遍历数组,并沿该索引显示每个图像。一旦到达当前场景中数组的末尾,我还可以通过单击右箭头键移至项目中的下一个场景。到目前为止,一切都很好。
当我尝试向后浏览幻灯片时,就会出现问题。我可以通过按向左箭头键轻松地在当前场景中向后跳转数组中的图像,但是当我尝试移回到上一个场景时,或者我在数组的开头,然后按左箭头键,我被打错了:
数组索引超出范围
我有点理解计算机在说什么-我正在尝试访问一个不存在的数组的索引,但是我在如何解决该问题上处于空白。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class LoadImage : MonoBehaviour {
[SerializeField] private Image newImage;
[SerializeField] Image[] nextImage;
int currentImageIndex = 0;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
GetNextImage();
}
private Image GetNextImage()
{
if (Input.GetKeyDown(KeyCode.RightArrow) && currentImageIndex < nextImage.Length)
{
newImage = nextImage[currentImageIndex];
newImage.enabled = true;
currentImageIndex++;
}
else if (Input.GetKeyDown(KeyCode.RightArrow) && currentImageIndex == nextImage.Length)
{
LoadNextScene();
}
else if (Input.GetKeyDown(KeyCode.LeftArrow) && currentImageIndex <= nextImage.Length)
{
Debug.Log("poop.");
newImage = nextImage[currentImageIndex - 1]; //<--- I think this is
newImage.enabled = false; // the problem
// child.
currentImageIndex--;
}
else if (Input.GetKeyDown(KeyCode.LeftArrow) && currentImageIndex == nextImage.Length - nextImage.Length)
{
LoadPreviousScene();
}
return newImage;
}
private void LoadNextScene()
{
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex + 1);
}
private void LoadPreviousScene()
{
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex - 1);
}
}
因此,我重申一下:我一次按向右箭头键浏览图像阵列。一旦到达数组的末尾,请再次按右箭头键,然后转到项目的下一个场景。但是,一旦进入下一个场景,由于“数组索引超出范围”错误,我将无法返回上一个场景-我的LoadPreviousScene()方法未得到调用。
当我在数组的第一个索引上时,我希望能够将左箭头键混搭并扔回到上一个场景中。
答案 0 :(得分:3)
问题是由于这种情况造成的:
else if (Input.GetKeyDown(KeyCode.LeftArrow) && currentImageIndex <= nextImage.Length)
执行newImage = nextImage[currentImageIndex - 1];
时,需要确保currentImageIndex
大于0。
这是我编写您的方法的方式:
private Image GetNextImage()
{
if (Input.GetKeyDown(KeyCode.RightArrow))
{
if(currentImageIndex < nextImage.Length)
{
newImage = nextImage[currentImageIndex++];
newImage.enabled = true;
}
else
{
LoadNextScene();
}
}
else if (Input.GetKeyDown(KeyCode.LeftArrow))
{
if(currentImageIndex > 0)
{
newImage = nextImage[currentImageIndex--];
newImage.enabled = false;
}
else
{
LoadPreviousScene();
}
}
return newImage;
}
请注意,我将键和索引之间的条件分开了,因为两次测试相同条件没有太大意义。