Unity编辑器脚本(入门指南)—第2部分

回呼

EditorWindow具有自己的回调,类似于MonoBehaviourEditor类使用的回调。 值得一提和解释的是其中最重要的。

如本文第1部分所述, OnEnable(), OnDisable()OnDestroy()用于初始化和停用资源。 仅当单击我们的编辑器窗口或在单击按钮时将鼠标悬停时, OnGUI()才能用于呈现GUI并调用。 EditorWindow具有另一个回调Update(),类似于MonoBehaviour的Update方法。 由于它可以异步使用,因此在所有可见的编辑器窗口中每秒调用100次。 您可以在Unity文档中消息部分下阅读有关回调消息的信息。

在编辑器窗口中添加GUI

让我们添加一些GUI并进行实际操作。 在OnGUI()中添加以下代码:

 私有void OnGUI() 
{
EditorGUILayout.LabelField(“ My Label”);
EditorGUILayout.TextField(“在此处输入您的文字...”);
}

切换到Unity编辑器,您的编辑器窗口应如下所示:

您可以在此处探索有关EditorGUILayout类的更多信息。 如您所见,我们已经在分层放置的编辑器窗口中绘制了标签和文本字段。 要为其提供适当的布局,请使用EditorGUILayout.BeginHorizo​​ntal() EditorGUILayout.EndHorizo​​ntal()

 私有void OnGUI() 
{
EditorGUILayout.BeginHorizo​​ntal();
EditorGUILayout.LabelField(“ My Label”);
EditorGUILayout.TextField(“在此处输入您的文字...”);
EditorGUILayout.EndHorizo​​ntal();
}

这将以正确的布局安排我们的UI:

AssetDatabase类

创建编辑器实用程序时,大多数时候,我们需要从项目中找到编辑器运行时的资产。 为此,Unity API为您提供了AssetDatabase类。 此类包含用于访问资产并对其执行文件操作的方法和接口。 我们将从资产中获取预制件,并在现场对其进行实例化。 首先,在OnGUI()方法内的编辑器窗口中创建一个对象字段:

 私有void OnGUI() 
{
EditorGUILayout.BeginHorizo​​ntal();
EditorGUILayout.LabelField(“ My Cube Prefab”);
myGameObject = EditorGUILayout.ObjectField(myGameObject,typeof(GameObject),true)作为GameObject;
EditorGUILayout.EndHorizo​​ntal();
  EditorGUILayout.EndVertical(); 
}

编辑器窗口中的“对象”字段如下所示:

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

声明一个GameObject类型的全局变量“ myGameObject”,并在上述代码的第8行下添加以下内容:

  EditorGUILayout.BeginHorizo​​ntal(); 
如果(GUILayout.Button(“ Get MyCube Prefab”))
{
myGameObject = AssetDatabase.LoadAssetAtPath (“ Assets / Prefabs / MyCube.prefab”)作为GameObject;
}
EditorGUILayout.EndHorizo​​ntal();

当单击按钮时, GUILayout.Button()返回一个布尔值为true,否则为false。 这就是从资产中获取预制件的方式:

现在让我们添加另一个按钮,该按钮将在场景中实例化该预制件:

  EditorGUILayout.BeginHorizo​​ntal(); 
如果(GUILayout.Button(“ Get MyCube Prefab”))
{
myGameObject = AssetDatabase.LoadAssetAtPath (“ Assets / Prefabs / MyCube.prefab”)作为GameObject;
}
 如果(GUILayout.Button(“在场景中实例化MyCube预制”)) 
{
实例化(myGameObject);
}
EditorGUILayout.EndHorizo​​ntal();

现在让我们看一下最终结果:

这是脚本的完整代码:

 公共类EditorWindowExample:EditorWindow 
{
私有静态EditorWindowExample _winInstance;
公共GameObject myGameObject;
  [MenuItem(“我的工具/显示我的编辑器窗口”) 
公共静态无效ShowWindow()
{
_winInstance = GetWindow (true,“我的编辑器窗口”);
}
 私有void OnGUI() 
{
EditorGUILayout.BeginVertical();
  EditorGUILayout.BeginHorizo​​ntal(); 
EditorGUILayout.LabelField(“ My Cube Prefab”);
myGameObject = EditorGUILayout.ObjectField(myGameObject,typeof(GameObject),true)作为GameObject;
EditorGUILayout.EndHorizo​​ntal();
  EditorGUILayout.BeginHorizo​​ntal(); 
如果(GUILayout.Button(“ Get MyCube Prefab”))
{
myGameObject = AssetDatabase.LoadAssetAtPath (“ Assets / Prefabs / MyCube.prefab”)作为GameObject;
}
 如果(GUILayout.Button(“在场景中实例化MyCube预制”)) 
{
实例化(myGameObject);
}
EditorGUILayout.EndHorizo​​ntal();
  EditorGUILayout.EndVertical(); 
}
}

您可以在Unity文档中阅读有关GUILayoutAssetDatabase.LoadAssetAtPath()的更多信息。

选择类

您还可以从层次结构或项目视图中选择一个对象并进行修改。 为此, 选择 上课很方便。 此类可访问Unity编辑器中的任何类型的选择。 让我们动手吧。 用以下代码替换OnGUI()中 EditorWindowExample类中的代码:

 私有void OnGUI() 
{
EditorGUILayout.BeginVertical();
  EditorGUILayout.BeginHorizo​​ntal(); 
EditorGUILayout.LabelField(“ Scene Selected GameObject”);
myGameObject = EditorGUILayout.ObjectField(myGameObject,typeof(GameObject),true)作为GameObject;
EditorGUILayout.EndHorizo​​ntal();
  EditorGUILayout.BeginHorizo​​ntal(); 
 如果(GUILayout.Button(“ Get Selected GameObject”)) 
{
myGameObject = Selection.activeGameObject;
}
EditorGUILayout.EndHorizo​​ntal();
EditorGUILayout.EndVertical();
}

您可以在第14行看到,我们刚刚将’myGameObject’变量分配给Selection.activeGameObject。 “ activeGameObject”属性返回层次结构中当前选定的游戏对象。 最后:

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