我有一个特定大小的程序生成的电路板。为了看到它,我通常必须运行,这非常烦人并且难以可视化。
是否可以通过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中可视化程序生成的地图?
答案 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
脚本创建自定义编辑器。
你可以添加几个按钮,如Create
和Destroy
,并且onClick,你可以在编辑时执行你想要的每个代码,而不是运行时。
这里有manual,其中包含有关如何在编辑器中执行代码的有用信息,以及用于编写编辑器扩展的video tutorial。