通过InitializeOnLoad

时间:2017-03-11 00:27:50

标签: c# unity3d gameobject

我有一个特定大小的程序生成的电路板。为了看到它,我通常必须运行,这非常烦人并且难以可视化。

是否可以通过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构造函数(或实例字段初始化程序),调用   它在Awake或Start中。从MonoBehaviour'Setup'上调用   游戏对象'Map'。

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

如果无法做到这一点,您应该如何在Unity中可视化程序生成的地图?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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