【问题标题】:Instantiate Freezing Unity实例化冻结 Unity
【发布时间】:2016-02-29 20:30:19
【问题描述】:

游戏一开始就尝试创建一个简单的圆形游戏对象的网格。每个圆圈之间的空间在 2D 中需要为 1.41 和 1.34。因此,通过一些数学运算,我会认为这个脚本会相对于初始参考对象创建这个网格。

但是,在编辑器中单击“播放”后,游戏会冻结,我必须在命令提示符下杀死 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));
        }
    }
}

【问题讨论】:

  • 然后尝试使用调试器并逐步执行代码我相信它会冻结在有问题和/或问题的行上。你调试过这个但我认为这个gameObject应该替换为transform,因为这是Instantiate(gameObject,这一行中新创建的对象实例@
  • 由此我认为 Awake 函数在每个副本上运行,并且在迭代器上永远不会超过 1,无休止地循环,有没有办法阻止这种情况?
  • @JamesHughes 你是对的,每个副本都会调用一次,所以你只是创建了无限循环。只需将网格创建和您的圆形对象分开即可。
  • @junipi 啊谢谢

标签: c# unity3d


【解决方案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,您正在使用 gameObject。这是对持有该脚本的游戏对象的引用。所以你似乎在做的是实例化该对象的克隆。新创建的对象也在触发循环,这将开始一个新的创建过程等等。

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

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));
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2018-03-30
    • 2019-08-07
    相关资源
    最近更新 更多