数组设置初值问题
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;
我有一个脚本可以用来给角色取或给 "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;