数组设置初值问题

Array set initial value problems

我有一个脚本可以用来给角色取或给 "life" 心形图像。

using UnityEngine;
using UnityEngine.UI;

public class Hearts : MonoBehaviour
{

    public Sprite[] initialHeart;
    private int hearts;
    private int currentHearts;
    // Use this for initialization

    //Used for chaching Image so that you won't be doing GetComponent<Image>(); each time
    Image heartImage;

    void Start()
    {
        //Cache the Image once so that you won't be doing GetComponent<Image>(); each time
        heartImage = GetComponent<Image>();
        heartImage.sprite = initialHeart[0];
        hearts = initialHeart.Length;
        }

    // Update is called once per frame
    void Update()
    {
    }

    public bool TakeHeart()
    {
        if (hearts < 0)
        {
            return false;
        }

        if (currentHearts < (hearts - 1))
        {
            currentHearts += 1;
            heartImage.sprite = initialHeart[currentHearts];
            return true;
        }
        else
        {
            return false;
        }
    }

    public bool AddHeart()
    {
        if (currentHearts > 0)
        {
            currentHearts -= 1;
            heartImage.sprite = initialHeart[currentHearts];
            return true;
        }
        else
        {
            return false;

        }
    }
}

我把最初的 3 颗心放进去,检查员放了尺寸 3:

array 0: 3 hearts

array 1: 2 hearts

array 2: 1 heart

如果玩家与炸弹(预制件)相撞,他会失去一颗心,如果他没有心,则调用屏幕 "GameOver"。

一切正常。但我决定做一个测试,我正在创建一个 "upgrade" 如果我为玩家获得皮肤,我会得到更多的“2”心。

检查员放 5 码

array 0: 5 hearts

array 1: 4 hearts

array 2: 3 hearts

array 3: 2 hearts

array 4: 1 heart

当我输入脚本时我的问题出现了:heartImage.sprite = initialHeart[3];游戏开始时只有“3”颗心。

当玩家与炸弹(预制件)相撞时,他会获得一条生命而不是失去一条生命,但接下来的碰撞会开始正常失去生命,直到游戏结束。

如果我开始时有 3 颗心,并且 "caught" 游戏中额外的一颗心不会改变,而不是 3 到 4,我仍然保持 3 颗心。

在我与第一颗炸弹(预制件)相撞并获得 1 颗心而不是失去后,脚本开始 运行 正常。撞到炸弹我输,多抓一颗心我赢

我想知道为什么当我把heartImage.sprite = initialHeart[0];(5颗心)改成heartImage.sprite = initialHeart[2];(3颗心)时,第一次碰撞会出现这个bug。

编辑

我找到了问题所在,但不知道如何解决。

我的数组会固定为5,但有时我想启动[0](5颗心)而其他情况启动[2](3颗心)。

Start () 内,声明 heartImage.sprite = initialHeart [2];(初始 3 心)。但是TakeHeart方法里面有取红心的功能。

if (currentHearts <(hearts - 1))
{
currentHearts + = 1;
heartImage.sprite = initialHeart [currentHearts]; ;
return true;
}

事实证明,当我声明时:heartImage.sprite = initialHeart [currentHearts];

我说的是initialHeart[1](4颗心),但应该是[3](2颗心)

可以做一些补充:initialHeart [currentHearts] + initialHeart [2]; `?

因此 intialHeart 的结果将是 [3](2 颗心),这是我想要的方式。

如果您增加数组的大小,但不更改您的其他代码以合并,您就会遇到这些问题。通过不使用固定索引使您的代码大小独立,至少对于上限。 0当然可以留下,但是你的上限应该是initialHeart[initialHeart.Length].

如果您想在运行时更改数组的大小,您需要将数组更改为其他可以动态调整大小的容器,如 List<>。为此,您可以使用 .Count 而不是 .Length,还有一个 .Last() 可以让最后一个元素更短一些。

尝试在 Start 方法中将 currentHearts 定义为 2...当您将 1 添加到它时,它将是 3,您将访问数组的索引 3。

currentHearts = 2;