通过 InitializeOnLoad 从编辑器实例化游戏对象

Instantiate GameObjects from editor via InitializeOnLoad

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

是否可以通过 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));
            }
        }
    }
}

但Unity的回应是抱怨

UnityException: Internal_CreateGameObject is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour 'Setup' on game object 'Map'.

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

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

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

创建宽度和高度变量,然后将它们公开给编辑器 - 通过将它们设置为 public 或通过 [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

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

这是编写编辑器扩展的manual with useful informations on how to execute code in the editor and a video tutorial