List 使用unity更新图像用户界面
我试图制作一个程序来更新玩家每回合的红心数量(满心、半心和空心)。当我这样做的时候,我实例化了一个预置的游戏对象作为变量,然后将它分配给unity中的UI面板。但是(我不确定,但我认为)之前更新中使用的变量在下一个循环中被销毁后仍然被引用,这给了我一个错误:List 使用unity更新图像用户界面,list,unity3d,methods,gameobject,List,Unity3d,Methods,Gameobject,我试图制作一个程序来更新玩家每回合的红心数量(满心、半心和空心)。当我这样做的时候,我实例化了一个预置的游戏对象作为变量,然后将它分配给unity中的UI面板。但是(我不确定,但我认为)之前更新中使用的变量在下一个循环中被销毁后仍然被引用,这给了我一个错误: MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. 以下
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
以下是更新循环:
void Update()
{
if (HP <= 0)
{
anim.SetBool("Death", true);
Destroy(GameObject.Find("Hearts"));
Destroy(GameObject.Find("Inventory"));
text.alignment = TextAnchor.LowerCenter;
text.text = "\n YOU DIED";
text.fontSize = 150;
text.color = new Color(255, 0, 0);
} else {
foreach (Transform child in GameObject.Find("Hearts").transform)
{
Destroy(child.gameObject);
}
for (var i = 0; i<(int)HP; i++)
{
GameObject Heart = Instantiate(heart, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
Heart.transform.SetParent(GameObject.Find("Hearts").transform);
}
if (HP - (float)((int)HP) == 0.5F) {
GameObject HalfHeart = Instantiate(halfheart, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
HalfHeart.transform.SetParent(GameObject.Find("Hearts").transform);
}
for (var i =0; i<Mathf.Floor(MaxHP-HP); i++)
{
GameObject EmptyHeart = Instantiate(emptyheart, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
EmptyHeart.transform.SetParent(GameObject.Find("Hearts").transform);
}
}
void Update()
{
if(HP问题是,一旦HP降到零以下,每次后续更新都会输入第一个if语句,并尝试一次又一次地删除“Hearts”和“Inventory”对象。您可以通过添加名为isDead
的bool并将该语句更改为if来解决此问题(HP如果我理解正确,您似乎在每一帧都销毁并重新设置健康栏。您将希望使其更受事件驱动(即在HP更改时仅更新一次健康栏)1.你不应该在Update
中使用Find
!2.你不应该多次使用Find
…如果某个东西只使用一次,请存储结果并在以后重用引用!3.你不应该在Update中一直销毁和重新实例化内容
这是非常高的性能要求,也是一种资源浪费。仅实例化一次内容。。。