MissingReferenceException:销毁移动的游戏对象后出错

时间:2016-06-28 11:50:24

标签: unity3d unity5

在我的游戏中,一些物体每隔几秒移动一次,其他物体不会移动。我已经创建了一个下面的方法来处理移动物体的移动。

private IEnumerator moveObject(GameObject movingObject, float posX, float duration) {
if(movingObject != null) {
    float elapsedTime = 0;
    Vector3 startPos = movingObject.transform.position;
    Vector3 endpos = new Vector3(posX, objectPositionY, camera.nearClipPlane);//hole.transform.position;

    while(movingObject != null && elapsedTime < duration) {
        movingObject.transform.position = Vector3.Lerp(startPos, endpos, elapsedTime / duration);
        elapsedTime += Time.deltaTime;
        yield return null;
    }
}
}

我也使用下面的代码销毁移动物体:

for (int i = 0; i < holeObjects.Count; i++) {
    Debug.Log ("countingholeobjectindex"+ i );

    if (col.gameObject.Equals (holeObjects [i].getHoleObject ())) {
       Debug.Log ("condition satisfied!" );

       foreach( HoleObjectSetup holeItem in holeObjects )
       {
          if (holeItem.getHoleObjectType () == HoleObjectSetup.HoleObjectType.moving) {
          int holeItemIndex = holeObjects.IndexOf(holeItem);
          holeItem.StopAllCoroutines();
          holeItem.DestroyHoleObject ();

          //holeObjects.RemoveAll(item=>item==null);
          //holeObjects.RemoveAt(holeItemIndex);

       }
    }
}

任何时候我摧毁一个movingObject(大多数时候它正在移动),我都会收到错误

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.

指向

movingObject.transform.position = Vector3.Lerp(startPos, endpos, elapsedTime / duration);

movingObject方法中(上面提供)。我尝试添加另一个无效检查以包围while循环的内容,但这使得Unity3d没有响应,让我有唯一的强制退出选项。我该如何解决这个问题?

更新 {/ 1}}在下面的协程中被调用:

movingObject

更新2

private IEnumerator MovementLogic(GameObject movingObject) { // keep going until deactivated or disabled float currentPos = movingObject.transform.position.x; while(filledPositions.Contains(currentPos)) { float newPos = getNextPos(currentPos); if(freePositions.Contains(newPos)) { freePositions.Add (currentPos); filledPositions.Remove (currentPos); freePositions.Remove (newPos); filledPositions.Add (newPos); yield return moveObject(movingObject, newPos, movementDuration); //update positions yield return new WaitForSeconds(movementDelay); currentPos = newPos; } else { // if a valid hole wasn't found, try the other direction next frame ReverseDirection(); } } yield return null; //} } DestroyHoleObject()的代码是:

HoleObjectSetup

    public void DestroyHoleObject   ()  {
    Destroy (currentHoleObject);
}

1 个答案:

答案 0 :(得分:3)

通过添加

解决问题
Debug.Log

到处声明。需要几秒钟的时间才能找出造成问题的周期中的确切点。

其次,

有时这些问题的廉价解决方案是,使用

DestroyImmediate

而不是

Destroy

这可能会为您提供快速解决方法。

第三。关于协程的更复杂:

像...这样的东西。

void OnEnable()
 {
 Debug.Log("enable .."); 
 }

void OnDisable()
 {
 StopCoroutine("Whatever");
 .. or perhaps ..
 StopAllCoroutines();
 }

此外,理想情况下,你应该手动处理#34;。

考虑你要摆脱的对象。

该课程应具有以下功能:

void BeingDestroyed()
 {
 .. carefully write your own code here to shut down the object ..
 }

...实际上在您要销毁它时明确地调用

在游戏中添加,破坏东西并不容易。它通常非常复杂。

该对象可能会自行销毁:执行任何所需的关机代码,如果与您相关,请等待一两帧,从任何列表中删除,然后&#34;销毁自我&#34;。

你不能单独留下协同程序&#34;:你必须手工管理它们。