
回呼
EditorWindow具有自己的回调,类似于MonoBehaviour和Editor类使用的回调。 值得一提和解释的是其中最重要的。
如本文第1部分所述, OnEnable(), OnDisable()和OnDestroy()用于初始化和停用资源。 仅当单击我们的编辑器窗口或在单击按钮时将鼠标悬停时, OnGUI()才能用于呈现GUI并调用。 EditorWindow具有另一个回调Update(),类似于MonoBehaviour的Update方法。 由于它可以异步使用,因此在所有可见的编辑器窗口中每秒调用100次。 您可以在Unity文档中消息部分下阅读有关回调消息的信息。
- 顶级游戏编程语言
- Pygame教程#5:简洁的事件编辑器。 为游戏增加可点击性。
- 编写您的第一个游戏:在Canvas上使用JavaScript玩Arcade Classic
- Agora.io现在为Unity Asset Store内部的游戏开发人员带来实时语音和视频聊天
- 地图/环境创建
在编辑器窗口中添加GUI
让我们添加一些GUI并进行实际操作。 在OnGUI()中添加以下代码:
私有void OnGUI()
{
EditorGUILayout.LabelField(“ My Label”);
EditorGUILayout.TextField(“在此处输入您的文字...”);
}
切换到Unity编辑器,您的编辑器窗口应如下所示:

您可以在此处探索有关EditorGUILayout类的更多信息。 如您所见,我们已经在分层放置的编辑器窗口中绘制了标签和文本字段。 要为其提供适当的布局,请使用EditorGUILayout.BeginHorizontal() 和EditorGUILayout.EndHorizontal() 。
私有void OnGUI()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(“ My Label”);
EditorGUILayout.TextField(“在此处输入您的文字...”);
EditorGUILayout.EndHorizontal();
}
这将以正确的布局安排我们的UI:

AssetDatabase类
创建编辑器实用程序时,大多数时候,我们需要从项目中找到编辑器运行时的资产。 为此,Unity API为您提供了AssetDatabase类。 此类包含用于访问资产并对其执行文件操作的方法和接口。 我们将从资产中获取预制件,并在现场对其进行实例化。 首先,在OnGUI()方法内的编辑器窗口中创建一个对象字段:
私有void OnGUI()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(“ My Cube Prefab”);
myGameObject = EditorGUILayout.ObjectField(myGameObject,typeof(GameObject),true)作为GameObject;
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
编辑器窗口中的“对象”字段如下所示:

单击按钮,从资产中获取预制件。 我们在Assets / Prefabs文件夹中已经有一个预制件。

声明一个GameObject类型的全局变量“ myGameObject”,并在上述代码的第8行下添加以下内容:
EditorGUILayout.BeginHorizontal();
如果(GUILayout.Button(“ Get MyCube Prefab”))
{
myGameObject = AssetDatabase.LoadAssetAtPath (“ Assets / Prefabs / MyCube.prefab”)作为GameObject;
}
EditorGUILayout.EndHorizontal();
当单击按钮时, GUILayout.Button()返回一个布尔值为true,否则为false。 这就是从资产中获取预制件的方式:

现在让我们添加另一个按钮,该按钮将在场景中实例化该预制件:
EditorGUILayout.BeginHorizontal();
如果(GUILayout.Button(“ Get MyCube Prefab”))
{
myGameObject = AssetDatabase.LoadAssetAtPath (“ Assets / Prefabs / MyCube.prefab”)作为GameObject;
}
如果(GUILayout.Button(“在场景中实例化MyCube预制”))
{
实例化(myGameObject);
}
EditorGUILayout.EndHorizontal();
现在让我们看一下最终结果:

这是脚本的完整代码:
公共类EditorWindowExample:EditorWindow
{
私有静态EditorWindowExample _winInstance;
公共GameObject myGameObject;
[MenuItem(“我的工具/显示我的编辑器窗口”)
公共静态无效ShowWindow()
{
_winInstance = GetWindow (true,“我的编辑器窗口”);
}
私有void OnGUI()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(“ My Cube Prefab”);
myGameObject = EditorGUILayout.ObjectField(myGameObject,typeof(GameObject),true)作为GameObject;
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
如果(GUILayout.Button(“ Get MyCube Prefab”))
{
myGameObject = AssetDatabase.LoadAssetAtPath (“ Assets / Prefabs / MyCube.prefab”)作为GameObject;
}
如果(GUILayout.Button(“在场景中实例化MyCube预制”))
{
实例化(myGameObject);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
}
您可以在Unity文档中阅读有关GUILayout , AssetDatabase.LoadAssetAtPath()的更多信息。
选择类
您还可以从层次结构或项目视图中选择一个对象并进行修改。 为此, 选择 上课很方便。 此类可访问Unity编辑器中的任何类型的选择。 让我们动手吧。 用以下代码替换OnGUI()中 EditorWindowExample类中的代码:
私有void OnGUI()
{
EditorGUILayout.BeginVertical();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(“ Scene Selected GameObject”);
myGameObject = EditorGUILayout.ObjectField(myGameObject,typeof(GameObject),true)作为GameObject;
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
如果(GUILayout.Button(“ Get Selected GameObject”))
{
myGameObject = Selection.activeGameObject;
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
您可以在第14行看到,我们刚刚将’myGameObject’变量分配给Selection.activeGameObject。 “ activeGameObject”属性返回层次结构中当前选定的游戏对象。 最后:

在我们的下一篇文章中,我们将为您提供一些更多的魔术知识,您可以使用编辑器脚本来完成这些魔术。 敬请关注!