我有以下脚本
using System.Collections;
using UnityEngine;
public class Bullet : MonoBehaviour
{
[SerializeField]
private float _speed;
private IEnumerator ShootAt(Vector3 target)
{
while (transform.position != target)
{
yield return null;
transform.localPosition = Vector3.MoveTowards(transform.localPosition, target, _speed * Time.deltaTime);
}
}
private void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Animal")
{
Destroy(gameObject);
}
}
}
子弹击中动物并被销毁后,出现以下错误:MissingReferenceException:'Bullet'类型的对象已被销毁,但您仍在尝试访问它。您的脚本应检查其是否为null或不破坏该对象。
错误是指我的代码中的while循环。我猜它仍在运行该循环,因为尚未满足停止它的条件
while(transform.position != target)
我尝试添加第二个条件来停止该循环,例如
while(transform.position != target || gameObject != null)
但这似乎不起作用。任何帮助将不胜感激。
答案 0 :(得分:2)
除了像注释中建议的其他用户那样进行重构之外,您可以尝试使用与您相同的逻辑,但是要相反:
while(gameObject != null || transform.position != target)
||
operator将按照写入顺序进行评估,因此在您的情况下,transform.position
仍在空检查之前得到评估。
此外,您可以考虑在对对象调用StopCoroutine
之前使用Destroy
。
最后,因为我个人也遇到了这种情况(可能与this行为有关)
C#对象唯一拥有的是指向本机对象的指针,因此Destroy(myGameObject)销毁了本机对象,但C#端的托管对象仍然存在,并且在不再引用并被收集时销毁了该对象。通过垃圾收集器。
因此,您可以考虑引入一个isHit
成员变量,并在成功碰撞后将其设置为true,然后再进行Destroy
的操作。