【问题标题】:Instantiate GameObjects from editor via InitializeOnLoad通过 InitializeOnLoad 从编辑器中实例化游戏对象
【发布时间】:2017-03-11 00:27:49
【问题描述】:

我有一个特定大小的程序生成板。为了看到它,我通常必须点击运行,这很烦人并且很难想象。

是否可以通过 InitializeOnLoad 制作并可视化电路板?

我试了一下:

Setup.cs

[InitializeOnLoad]
public class Setup : MonoBehaviour {

    public static Map initialMap;

    static Setup(){
        initialMap = new Map ();
        initialMap.createMap ();
    }
}

Map.cs

public class Map {
    private Tile[,] tiles= new Tile[5,5];
    //I had Resources.Load here, but apparently thats not allowed either...
    public GameObject defaultObj= new GameObject("MyCreatedGO"); 

    public Map (){
        Debug.Log("In Constructor");
    }

    public void createMap(){
        for (int x = 0; x < tiles.GetLength(0); x += 1) {
            for (int y = 0; y < tiles.GetLength(1); y += 1) {
                // Tile Instantiates the defaultObj
                tiles [x, y] = new Tile (defaultObj, new Vector3 (x, y, 0));
            }
        }
    }
}

但团结的回应是抱怨

UnityException: 不允许调用 Internal_CreateGameObject 从 MonoBehaviour 构造函数(或实例字段初始值设定项),调用 它改为唤醒或开始。从 MonoBehaviour 'Setup' 调用 游戏对象“地图”。

当 InitializeOnLoad-ed 静态构造函数发生时,引擎是否处于可以生成对象的状态?

如果这不可能,您应该如何在 Unity 中可视化程序生成的地图?

【问题讨论】:

    标签: c# unity3d gameobject


    【解决方案1】:

    我不确定 Unity 是否可以做到这一点,但您可以解决它。

    创建一个宽度和高度变量,然后将它们公开给编辑器 - 通过将它们设为公共或通过 [SerializeField] 属性,然后在编辑器运行游戏时在检查器中编辑它们。将这些变量用于 createMap() 中的 x 和 y 值。然后你只需要在 Update() 中添加一个这样的部分,左键单击生成一个新地图:

            if (Input.GetMouseButtonDown(0))
            {
                // call generate map here
            }
    

    也请查看本教程:https://unity3d.com/learn/tutorials/projects/procedural-cave-generation-tutorial/cellular-automata

    【讨论】:

      【解决方案2】:

      您可以为您的Setup 脚本创建自定义编辑器。 您可以向其中添加几个按钮,例如 CreateDestroy,并且在 onClick 上,您可以在编辑时而不是运行时执行您想要的所有代码。

      这是manual,其中包含有关如何在编辑器中执行代码的有用信息,以及用于编写编辑器扩展的video tutorial

      【讨论】:

        猜你喜欢
        • 2018-10-28
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多