我有一个脚本,用于接受或给予生命"对于角色心形的形象。
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颗心),就像我想要的那样。
答案 0 :(得分:2)
如果增加数组的大小,但不要更改其他代码以合并,那么就会遇到这些问题。通过不使用固定索引使您的代码大小独立,至少对于较高范围。 0
当然可以保留,但您的上端应该是initialHeart[initialHeart.Length]
。
如果要在运行时更改数组的大小,则需要将数组更改为可以像List<>
一样动态调整大小的其他容器。为此,您可以使用.Count
代替.Length
,还可以使用.Last()
将最后一个元素缩短一点。
答案 1 :(得分:1)
尝试在Start方法中将currentHearts定义为2 ...当你向它添加1时,它将是3并且你将访问数组的索引3。
currentHearts = 2;