数组设置初始值问题

时间:2016-05-17 17:30:37

标签: c# arrays unity3d unityscript

我有一个脚本,用于接受或给予生命"对于角色心形的形象。

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:

array 0: 3 hearts

array 1: 2 hearts

array 2: 1 heart

如果玩家与炸弹(预制件)发生碰撞,他就会失去一颗心,如果他没有心脏叫屏幕&#34; GameOver&#34;。

一切都很完美。但我决定做一个测试,我正在创建一个&#34;升级&#34;如果我为玩家获得了一个皮肤,我会相处更多&#39; 2&#39;心。

检查员放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];游戏仅以&#34; 3&#34;心。

当玩家与炸弹(预制)发生碰撞时,他获得了生命而不是失去一条生命,但是随后的碰撞它开始失去生命,直到比赛结束。

如果我从3个心开始并且&#34;抓住&#34;游戏中额外的心脏不会改变,而不是3到4,我仍然留着3颗心。

在我与第一个炸弹(预制)碰撞并获得1颗心而不是丢失之后,脚本开始正常运行。如果你与炸弹发生碰撞,我会失败,如果抓住了额外的心脏,我就赢了。

我想知道为什么当我将heartImage.sprite = initialHeart[0];(5颗心)更改为heartImage.sprite = initialHeart[2];(3颗心)时,在第一次碰撞中出现此错误。

修改

我发现问题所在,但不知道如何解决。

我的数组将被修复5,但有时我想开始[0](5颗心)和其他开始[2](3颗心)的情况。

Start ()内,声明heartImage.sprite = initialHeart [2];(最初3颗心)。但是在TakeHeart方法中有一个带有Hearts的功能。

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颗心),就像我想要的那样。

2 个答案:

答案 0 :(得分:2)

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

如果要在运行时更改数组的大小,则需要将数组更改为可以像List<>一样动态调整大小的其他容器。为此,您可以使用.Count代替.Length,还可以使用.Last()将最后一个元素缩短一点。

答案 1 :(得分:1)

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

currentHearts = 2;