1、Unity编辑器扩展介绍

Unity为开发者们提供了很方便的扩展功能,编辑器扩展主要可以用于在Unity界面中添加属于自己的菜单、插件。有时可以大大的提高开发效率。

用于编辑器扩展的脚本都放在Editor文件夹中,此文件夹中的资源不会在项目发布时候打包。

2、具体功能

在使用扩展功能时,需要引用UnityEditor命名空间

2.1、在菜单栏中添加扩展

在菜单栏中的扩展可以自己新创,也可以加在已有的菜单里面。

using UnityEditor;
public class Tools
{
[MenuItem("MyTools/Test1")] //让其显示在菜单栏MyTools-Test1下,MyTest1方法表示要做的工作
//放在其下面的方法代表调用这个。上面写的是路径名字
private static void MyTest1() //只有静态方法可以使用MenuItem属性
{
Debug.Log("扩展1");
}
}

[MenuItem("MyTools/Test1",false,1)]

第一个参数:显示在菜单栏的位置

第二个参数:是否为验证函数,默认为false

第三个参数:优先级,默认为1000。优先级越大越靠下面,优先级相差>10时,会出现分隔符

2.2、为扩展事件添加快捷键

[MenuItem("MyTools/Test1 %t",false,11)]

在第一个参数后面加空格然后写要加的快捷键。

此例就代表快捷键为 Ctrl+t

% == Ctrl

# == Shift

& == alt

2.3、在Hierarchy,Project视图中右键添加扩展

Hierarchy视图右键下的基本都是GameObject菜单第一层分割线之上的扩展。

那么只要把扩展放在第一层的分割线之上不就行了。

而优先级为11则刚好在第一层分割线的最后一个。

[MenuItem("GameObject/Test1",false,11)]

Project右键下的选项基本都在Assets目录下,添加方法同上。

2.4、使用Selection类选择游戏物体

Selection属于UnityEditor命名空间。

//返回选择场景中的一个游戏物体或者预制体。未选择会报错返回none,选择多个会返回第一个。
GameObject go1 = Selection.activeGameObject; //返回选择场景中的一个游戏物体或预制体、脚本等任意物体。未选择会报错返回none,选择多个会返回第一个。
Object object1 = Selection.activeObject; //返回选择场景中的一个游戏物体。未选择会报错返回none,选择多个会返回第一个。
Transform transform = Selection.activeTransform; //返回GameObject类型数组,为选择场景中的多个游戏物体或者预制体。只会选择符合条件的,未选择则数组长度为0。
GameObject[] gameObjects = Selection.gameObjects; //返回Object类型数组,为选择场景中的多个游戏物体或者任意资源。只会选择符合条件的,未选择则数组长度为0。
Object[] objects = Selection.objects; //返回transform类型数组,为选择场景中的多个游戏物体。只会选择符合条件的,未选择则数组长度为0。
Transform[] transforms = Selection.transforms;

2.5、Menuitem第二个参数

使用第二个参数时一般配合两个方法来使用。

    [MenuItem("SelectionTest/Test1 _t", true, 1)]
static bool Test()
{
if (Selection.activeTransform == null)
return false;
return true;
} [MenuItem("SelectionTest/Test1 _t",false,1)]
static void Test1()
{
Debug.Log(Selection.activeTransform.name);
}

第二个方法在未选择物体时,本来会报错none。

当使用第二个参数设为true时,只有当此函数返回为true,才会继续执行下面的函数。

那么当未选择物体时,第一个函数返回false,就不会再进行第二个函数。就避免了报错的情况。

注意:MenuItem里的游戏路径和名称必须都相同。

2.6、ContextMenu和ContextMenuItem

第一个类用于在组件的右键中添加扩展。

别的脚本中写其他脚本的扩展需要使用静态方法

本脚本中添加扩展,不需要使用静态方法

  1. 对系统组件添加扩展
	[MenuItem("CONTEXT/Rigidbody/Clear")]
//CONTEXT(默认写法) , 组件名 , 扩展名
static void ClearMassGravity(MenuCommand cmd)
//MenuCommand是当前正在操作的组件对象。只要定义就行,系统会自动赋值
{
Rigidbody rgd = cmd.context as Rigidbody;
//MenuCommand.context为正在操作的组件对象
rgd.mass = 0;
}
  1. 对自定义脚本添加扩展
	//自定义脚本的话可以在别的脚本里面写,也可以在本脚本写。
//一般都在本脚本写,因为可以更方便的访问脚本中已经存在的游戏物体
[ContextMenu("SetColor")]
void SetColor()
{
flashColour = Color.green;
}
  1. 对脚本的属性添加扩展
	//属于MonoBehaviour,不需要引用Editor。
//第一个参数为扩展名,第二个为方法名
[ContextMenuItem("Add", "AddHp")]
public int startingHealth = 100;
void AddHp()
{
startingHealth += 20;
}

2.7、ScriptableWizard---对话框

当参与的项目非常大时,假如LOL。如果想把所有英雄的HP都一起修改时,使用之前的方法就要一个一个的修改,工作量巨大。

那么有没有更加简单的方法呢?

  1. 静态方法---对话框的创建

    DisplayWizard<类名>(对话框名,Create按钮名,OtherButton按钮名);

  2. 事件---对话框按钮事件

    OnWizardCreate:Create按钮事件名

    OnWizardOtherButton:OtherButton按钮事件名

    OnWizardUpdate:打开对话框或改变对话框内容时调用此方法

  3. OnEnable:当对话框被创建时调用一次

using UnityEngine;
using UnityEditor; public class EnemyChange : ScriptableWizard { public int changeStartHpValue = 150;
public int ChangeSinkSpeed = 11;
public const string changeStartHpValueKey = "changeStartHpValue";
public const string ChangeSinkSpeedKey = "ChangeSinkSpeed"; //创建对话框扩展
[MenuItem("Tools/CreateWizard")]
static void CreateWizard()
{
DisplayWizard<EnemyChange>("统一修改敌人","Change And Close","Change");
//EnemyChange为类名,对话框名字,Create按钮的名字,OtherButton按钮名字
//第2、3参数都可以省略
//Create点击后会关闭对话框,OtherButton按钮点击后不会关闭对话框
} //检测Create按钮点击的自带方法
private void OnWizardCreate()
{
GameObject[] enemyPrefabs = Selection.gameObjects; int count = 0;
EditorUtility.DisplayProgressBar("进度", count + "/" + enemyPrefabs.Length, 0); foreach (GameObject go in enemyPrefabs)
{
//获取物体的EnemyHealth脚本
CompleteProject.EnemyHealth hp = go.GetComponent<CompleteProject.EnemyHealth>();
Undo.RecordObject(hp, "Change Health And Speed"); //开始记录对hp的更改,之后对其的更改都可以撤销 //改变物体的属性
hp.startingHealth = changeStartHpValue;
hp.sinkSpeed = ChangeSinkSpeed; count++;
EditorUtility.DisplayProgressBar("进度", count + "/" + enemyPrefabs.Length, (float)count/enemyPrefabs.Length);
}
EditorUtility.ClearProgressBar();
} //检测Other Button按钮方法
private void OnWizardOtherButton()
{
OnWizardCreate();
ShowNotification(new GUIContent(Selection.gameObjects.Length + "值被修改了"));
} //打开对话框或改变对话框内容时调用此方法
private void OnWizardUpdate()
{
helpString = "";
errorString = "";
if(Selection.gameObjects.Length > 0)
{
helpString = "您当前选择了" + Selection.gameObjects.Length + "个敌人";
}
else
{
errorString = "请选择至少一个敌人";
}
EditorPrefs.SetInt("changeStartHpValue", changeStartHpValue);
EditorPrefs.SetInt("ChangeSinkSpeed", ChangeSinkSpeed);
} //当窗口被创建时调用
private void OnEnable()
{
changeStartHpValue = EditorPrefs.GetInt(changeStartHpValueKey, changeStartHpValue);
ChangeSinkSpeed = EditorPrefs.GetInt(ChangeSinkSpeedKey, ChangeSinkSpeed); } //打开修改选中的物体时调用此方法
private void OnSelectionChange()
{
OnWizardUpdate();
}
}

Unity---编辑器扩展---更新中的更多相关文章

  1. unity 编辑器扩展简单入门

    unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...

  2. Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

    Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject  Unity编辑器扩展 Chapt ...

  3. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  4. Unity 编辑器扩展

    自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...

  5. Unity编辑器扩展Texture显示选择框

    学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...

  6. Unity 编辑器扩展 场景视图内控制对象

    http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...

  7. unity编辑器扩展_01(在工具栏中创建一个按钮)

    代码: [MenuItem("Tools/Test",false,1)]    static void Test()    {        Debug.Log("tes ...

  8. unity编辑器扩展_03(在组件中右击创建一个选项,并通过该选项修改该组件下面的字段的值)

    在组件中右击创建一个选项代码: [MenuItem("CONTEXT/PlayerHealth/InitHealth")]    static void Test5()    {  ...

  9. unity编辑器扩展_02(分别在Hierarchy,Project中创建一个选项)

    在Hierarchy面板创建选项的代码: [MenuItem("GameObject/Test",false,1)]    static void Test1()    {     ...

随机推荐

  1. pom.xm首行报错Failure to transfer org.codehaus.plexus:plexus-components:pom:1.1.20

    从SVN导出一个Maven项目,pom.xml首行报错: Failure to transfer org.codehaus.plexus:plexus-components:pom:1.1.20 fr ...

  2. iOS中的数据存储

    SQLite3 SQLite3是一款开源的嵌入式关系型数据库,可移植性好,易使用,内存开销小. SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中. SQLite3常用的4种 ...

  3. JAVA基础知识(16)-----Integer

    Integer对象数字格式的字符串转成基本数据类型的方法:1:将该字符串封装成了Integer对象,并调用对象的方法intValue();2:使用Integer.parseInt(numstring) ...

  4. Rename Oracle Managed File (OMF) datafiles in ASM(ZT)

    Recently I was asked to rename a tablespace. The environment was Oracle version 11.2.0.3 (both datab ...

  5. UIBezierPath和CAShapeLayer配合肆意画图

    一.CAShapeLayer CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形   使用CAShapeLayer 绘制一个矩形 let layer ...

  6. Developer tools

    20. Developer tools Spring Boot includes an additional set of tools that can make the application de ...

  7. eclipse 报错:GC overhead limit exceeded

    还是eclipse内存问题 修改eclipse.ini -Xms512m -Xmx1024m 必要的情况下, 添加 -XX:MaxPermSize=1024M  表示在编译文件时一直占有最大内存

  8. 使用网络用户命令行工具的/passwordreq:yes

    提示:"新建域时,本地administrator帐户将成为域administrator账户.无法新建域,因为本地administrator账户密码不符合要求.目前,本地administrat ...

  9. CustomProgressDialog

    1 ,布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  10. ListView里面嵌套CheckBox

    布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andro ...