【问题标题】:Unity C# scripting - infinite loop without a loop...wait what?Unity C# 脚本 - 没有循环的无限循环......等等什么?
【发布时间】:2017-11-02 02:57:40
【问题描述】:

我刚刚开始使用 Unity,我正在尝试编写一个简单的 C# 脚本,将预制件(一些 2D 精灵)放置在预定义的位置。问题是,每当我将脚本应用到预制件并尝试播放场景时,Unity 会冻结并显然会生成一个无限循环,耗尽所有内存(有时甚至给我一个黑屏),我必须强制杀死任务管理器中的进程。

然而,代码非常简单,根本不包含循环:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DungeonTest : MonoBehaviour {

    public Transform DungeonBuilder;

    // Use this for initialization
        void Start ()
     {
        Instantiate (DungeonBuilder, new Vector2 (1, 1), DungeonBuilder.rotation);
        Instantiate (DungeonBuilder, new Vector2 (2, 2), DungeonBuilder.rotation);
        Instantiate (DungeonBuilder, new Vector2 (3, 3), DungeonBuilder.rotation);

    }

    void Update()
    {


    }
}

从 Hierarchy Window 可以看出,Start() 方法创建了多个实例,内存使用率也上升到 85%(!):

Unity infinite loop(?)

请就此处可能出现的问题提出建议。我已经看过几个教程视频,并且我已经阅读了文档中的相关段落,但我似乎无法弄清楚这一点。

谢谢!

【问题讨论】:

  • 你的地下城建造者板块上是否有任何脚本?场景中的瓦片以 3 的幂增长,这告诉我实例化瓦片上的某些东西也在制作新瓦片。也许您不小心将 DungeonTest 脚本放在了 tile 预制件上?
  • 不,只有这个脚本附加到预制件上。场景的层次结构仅包括主摄像机和作为组件添加此脚本的 dungeonTile 预制件。我按照文档“实例化预制件”部分中的说明进行操作。
  • 等一下……这个脚本在预制件上,因为这个脚本是你的DungeonBuilder GameObject 的一个组件?这意味着每个实例化对象都会调用自己的Start (),这反过来又会创建另外 3 个实例化对象,依此类推,等等。这似乎与您的场景的屏幕截图一致。

标签: c# unity3d monodevelop infinite-loop


【解决方案1】:

您的 DungeonTest 脚本不应位于您正在实例化的预制件上。发生的情况是每次预制件实例化时都会执行 Start()。

所以第一个图块创建了 3 个新图块。现在,这些图块中的每一个也可以生成 3 个新图块,以此类推直到无穷大。

使用 DungeonTile 脚本在场景中创建一个新对象,并从您正在实例化的预制件中删除所有脚本。

这并不意味着您的预制件上不能有脚本。只需记住,您的 Start() 方法中的任何内容都会在您的新实例添加到场景后立即执行。

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2011-04-30
    • 2017-12-12
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多