2016-02-29 68 views
0

试图在游戏开始时立即创建一个简单的圆形游戏物体的网格。每个圆之间的空间需要是2D的1.41和1.34。所以用一点数学,我会认为这个脚本会创建相对于初始参考对象的这个网格。实例化冻结Unity

但是,在编辑器中单击游戏时,游戏就会冻结,我必须用命令提示符杀死Unity。

任何想法?

下面是代码:

void Awake() 
{ 
    Transform transform = gameObject.GetComponent<Transform>(); 
    for (float i = 1; i < 8; i++) 
    { 
     for (float j = 1; j<8;j++) 
     { 
      Instantiate(gameObject, transform.position + new Vector3(i * 1.41f, 0, j * 1.34f), new Quaternion(0, 0, 0, 0)); 
     } 
    } 
} 
+0

尝试使用调试器,然后逐步通过代码我相信它会冻结在有问题和/或问题的线上。你有没有调试过,但我会认为这个'gameObject'应该被替换因为这是这一行中新创建的对象实例'Instantiate(gameObject,' – MethodMan

+0

由此我认为Awake函数正在每个副本上运行,并且永远不会在迭代器上超过1,循环不休,在那里任何方式来阻止这种情况? –

+1

@JamesHughes你说得对,每次复制都会调用一次,所以你刚刚创建了无限循环,只是单独创建网格和创建圆形对象。 – juniperi

回答

1
void Awake() 
{ 
    Transform transform = gameObject.GetComponent<Transform>(); 
    for (float i = 1; i < 8; i++) 
    { 
     for (float j = 1; j<8;j++) 
     { 
      Instantiate(gameObject, transform.position + new Vector3(i * 1.41f, 0, j * 1.34f), new Quaternion(0, 0, 0, 0)); 
     } 
    } 
} 

寻找到你的Instantantiate,您使用的游戏对象。这是持有该脚本的游戏对象的引用。所以你似乎在做的是实例化该对象的克隆。新创建的对象也触发循环,这将启动一个新的创建过程等等。

总而言之,您创建了一个无限循环。你需要创建一个其他东西的实例,最有可能的是预制瓷砖。

public GameObject myTilePrefab; 
void Awake() 
{ 
    Transform transform = gameObject.GetComponent<Transform>(); 
    for (float i = 1; i < 8; i++) 
    { 
     for (float j = 1; j<8;j++) 
     { 
      Instantiate(myTilePrefab, transform.position + new Vector3(i * 1.41f, 0, j * 1.34f), new Quaternion(0, 0, 0, 0)); 
     } 
    } 
} 
相关问题