通过 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
脚本创建自定义编辑器。
您可以向其中添加几个按钮,例如 Create
和 Destroy
,并且在单击时,您可以在编辑时而不是运行时执行您想要的每个代码。
这是编写编辑器扩展的manual with useful informations on how to execute code in the editor and a video tutorial。
我有一个特定大小的程序生成板。为了看到它,我通常必须点击 运行,这很烦人并且很难想象。
是否可以通过 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
脚本创建自定义编辑器。
您可以向其中添加几个按钮,例如 Create
和 Destroy
,并且在单击时,您可以在编辑时而不是运行时执行您想要的每个代码。
这是编写编辑器扩展的manual with useful informations on how to execute code in the editor and a video tutorial。