【问题标题】:Destroying assets is not permitted to avoid data loss不允许破坏资产以避免数据丢失
【发布时间】:2017-05-15 07:08:07
【问题描述】:

我在执行代码的 RemoveTail 函数时遇到了问题:destroy(gameObject)。这个蛇游戏创建了我的 Snake 预制件的克隆,我通过分配“尾巴”并在达到 maxSize 时删除“尾巴”游戏对象来控制 Snake 的长度。我知道我的错误是由于游戏删除了我的尾巴,它是预制件的克隆,而不是删除 Snake 的实例。关于如何解决此问题的任何想法或建议?

蛇脚本

public class Snake : MonoBehaviour {

private Snake next;  
public Snake GetNext() {
    return next;
}

public void SetNext(Snake IN) {
    next = IN;
}

public void RemoveTail() {      // This method destroys the gameObject assigned as tail
    Destroy(gameObject);
}

public static Action<string> hit;

public void OnTriggerEnter(Collider other) {
    if (hit != null)
        hit(other.tag);
    if (other.tag == "Food")
        Destroy(other.gameObject);
    }
}

摘自我的 GameController 脚本

void TailFunction() {
    Snake tempSnake = tail; // Create a temp Snake variable to store tail information
    tail = tail.GetNext();  // Now that we have a copy of original tail in tempSnake, we set the next Snake gameobject as our new tail
    tempSnake.RemoveTail(); // Remove the original tail gameObject
}

void Movement() {
    GameObject temp;
    nextPos = head.transform.position;
    switch (direction) {
        case Direction.North:
            nextPos = new Vector2(nextPos.x, nextPos.y+1);
            break;
        case Direction.East:
            nextPos = new Vector2(nextPos.x+1, nextPos.y);
            break;
        case Direction.South:
            nextPos = new Vector2(nextPos.x, nextPos.y-1);
            break;
        case Direction.West:
            nextPos = new Vector2(nextPos.x-1, nextPos.y);
            break;
    }
    temp = (GameObject)Instantiate(snakePrefab, nextPos, transform.rotation);
    head.SetNext(temp.GetComponent<Snake>());
    head = temp.GetComponent<Snake>();
    return;
}

void TimerInvoke() {
    Movement();
    if (currentSize == maxSize)
        TailFunction();
    else
        currentSize++;
}

【问题讨论】:

  • 你在初始化tail变量吗?如果是,请您分享相关代码。
  • destroy 线是为了破坏尾巴,但你正在破坏实际的对象。你的措辞令人困惑还是你做错了?我认为你的销毁线应该是 Destroy(next.gameObject);
  • 我没有初始化 tail 变量。我的蛇由立方体组成。我实例化一个立方体并将其指定为头部,然后我继续在我的蛇行进的方向上创建新的立方体。然后我将最后一个立方体作为尾巴存储在我的蛇中,如果达到最大尺寸,我会破坏“尾巴” .当我的蛇在网格中移动时,我不断地创建一个新的立方体“头”并摧毁我的最后一个立方体“尾”。
  • 好吧,你必须在某处初始化tail,否则它将永远是null
  • 我很抱歉造成混乱。在我的脑海中,如果正在考虑实例化而不是初始化 - 我没有将立方体实例化为尾部,而是实例化了一个立方体,将其设置为头部和尾部。我相信我正在用我的 TailFunction() 初始化尾部。不是这样吗?

标签: unity3d


【解决方案1】:

我的问题是我将我的预制件拖到我的检查器中并删除了我原来的蛇形立方体。我的程序不是在游戏开始时将我原来的蛇形立方体指定为尾巴然后删除游戏对象,而是将我的实际预制件指定为尾巴并尝试彻底删除预制件。

【讨论】:

    【解决方案2】:

    我还尝试通过将预制件传递给变量来解决这个问题,但我遇到了同样的问题。然后我看到实例化的游戏对象在“销毁(exampleGameobject)”命令之前被销毁或启用为假。 然后我尝试了这样的命令: 如果(例如GameObject.activeInHierarchy) 销毁(exampleGameObject)

    然后我没有收到任何这样的 LogError。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多