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. centos软件安装目录(amp目录)

    entos安装软件的目录 1. 如果是rpm安装的可以:rpm -ql package-name 2. 可以在根目录上直接find . -name 软件中的某个文件名 不过安装软件一般都在/usr/l ...

  2. 问题:table 可否实现对角线;结果:用div+css模拟表格对角线

    首先声明: 这只是探讨一种CSS模拟表格对角线的用法,实际在工作中可能觉得这样做有点小题大作,这不是本主题讨论的重点.如果对此深以为然的朋友,请一笑过之... 有时在插入文档时,要用到表格对角线,常见 ...

  3. CentOS6.5 释放SWAP

      虚拟内存的释放一般都是伴随着关闭应用程式来说的   可以通过命令刷新swap还原到初始状态: swapoff -a swapon -a     例如: [root@wjlcn1026 vm]# f ...

  4. Linux 2.6 中的文件锁

    简介: 本文的目的是想帮助读者理清 Linux 2.6中文件锁的概念以及 Linux 2.6 都提供了何种数据结构以及关键的系统调用来实现文件锁,从而可以帮助读者更好地使用文件锁来解决多个进程读取同一 ...

  5. mysql show status 参数解析

    状态名 作用域 详细解释 Aborted_clients Global 由于客户端没有正确关闭连接导致客户端终止而中断的连接数 Aborted_connects Global 试图连接到MySQL服务 ...

  6. mysql case

    1.table CREATE TABLE `lee`(`id` INT(10) NOT NULL auto_increment,`name` varchar(20) DEFAULT null,`bir ...

  7. var_dump — 打印变量的相关信息

    <?php $a = array( 1 , 2 , array( "a" , "b" , "c" )); var_dump ( $a ...

  8. ROS Learning-022 learning_tf-06(编程) 现在与过去中穿梭 (Python版) --- waitForTransformFull() 函数

    ROS Indigo learning_tf-06 现在与过去中穿梭 (Python版) - waitForTransformFull() 函数 我使用的虚拟机软件:VMware Workstatio ...

  9. linux sdcv命令

    一.简介 sdcv全称为stardict console version,是终端下的词典.   二.安装 1)安装sdcv yum install -y sdcv 2)安装字典 http://www. ...

  10. Entity Framework Tutorial Basics(16):Linq-to-Entities Projection Queries

    Linq-to-Entities Projection Queries: Here, you will learn how to write LINQ-to-Entities queries and ...