gpt4 book ai didi

c# - 缺少引用异常 : The object of type 'Attacker' has been destroyed but you are still trying to access it

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:13 25 4
gpt4 key购买 nike

我收到上述错误,我尝试使用 debug.log 打印错误所在。我正在创建一种坦克对象。触发一些实例化的对象。实例化对象是攻击者。

在更新中,我使用 foreach 循环遍历所有实例化对象。如果找到并且如果对象在射程范围内。

void Update () {

if (attacker!= null )
{
//Debug.Log("inside att");
attacker = FindObjectsOfType<Attacker>();
}

// fire only if attacker is in range

if (IfInRange() && attacker!= null && running)
{

faceTowardTarget();
Fire();
}

}
bool IfInRange()
{// run through all the instantiated attacker
foreach (Attacker currentAttacker in attacker)

这工作正常,但有时会出现上述情况。在控制台的最后,循环不断进行,最后 currentAttacker 为 null。我试图在控制台中打印它。但它不会进入其他 if 语句

{   //if attacker is in range

if (attacker != null )
{

Debug.Log(currentAttacker.GetComponent<Health>().isAlive);

if (Vector2.Distance(transform.position, currentAttacker.transform.position) < minDistance)
{

attackerPos = currentAttacker.transform;

return true;
}
}
if (currentAttacker == null)
{
Debug.Log("curre Attacker null");
running = false;
return false;
}

}return false;
}

攻击者有一个简单的健康脚本来处理被射弹击中时造成的伤害。

Void update()
{
if (health <= 0)
{
**is there any better way to destroy an obj. If i destroy gameObject that error appear and it get stuck in foreach loop**
// Destroy(gameObject);
noOfKilled++;
isAlive = false;
scoreHolder.addScore(scoreValue);
}
}

非常感谢您的帮助。我尝试搜索但无法解决此问题。

最佳答案

解决此问题的快速而肮脏的方法是使用 DestroyImmediate函数而不是 Destroy功能。使用 DestroyImmediate(gameObject)将销毁该框架中的对象并且FindObjectsOfType<Attacker>()找不到它,所以它不会在 foreach 中访问循环。


正确的方法是创建一个 List在您的主代码中保存实例化的 Attacker脚本:

public GameObject attackerPrefab;
public List<Attacker> attacker = new List<Attacker>();

当您实例化预制件时,添加 Attacker List 的脚本:

//Instantiate
GameObject obj = Instantiate(attackerPrefab);
//Get Attacker component
Attacker tempAttacker = obj.GetComponent<Attacker>();
//Add Attacker component to List
attacker.Add(tempAttacker);

最后,当您想销毁健康脚本中的攻击者对象时,将其从 List 中移除然后销毁它。通过将其从 List 中删除在销毁它之前,您不会访问标记为已销毁的对象。

//Get the script that stores the List of Attacker
Test otherScript = GameObject.Find("NameOfGameObjectYourScriptIsAttachedTo").GetComponent<Test>();
//Remove from the List
otherScript.attacker.Remove(gameObject.GetComponent<Attacker>());
//Now, destroy this gameObject
Destroy(gameObject);

关于c# - 缺少引用异常 : The object of type 'Attacker' has been destroyed but you are still trying to access it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52518673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com