【发布时间】: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