环境:Unity2017.2 语言:C#

总起:

今天主要介绍以下内容:

1.通过MenuCommand、Selection获取选中对象;

2.通过Undo编写可撤销的命令;

3.窗口小部件的显示。

MenuCommand:

我们先来看一个点击增加血量的例子:

[MenuItem("CONTEXT/PlayerInfo/Plus 5 Hp", false, 20)]
public static void Plus5Hp(MenuCommand cmd)
{Debug.Log(cmd.userData);PlayerInfo playerInfo = (PlayerInfo)cmd.context;playerInfo.hp += 5;
}

这边唯一有用的变量就是MenuCommand.context提供当前右键的组件,它本身是个object,所以需要进行强转。

至于MenuCommand.userData,在MenuItem的使用方式中它没有被赋值。

Selection:

重点是Selection,我们使用该类来重写上面的例子:

[MenuItem("CONTEXT/PlayerInfo/Plus 5 Hp2", false, 20)]
public static void Plus5Hp2()
{var playerInfo = Selection.activeTransform.GetComponent<PlayerInfo>();if (playerInfo != null)playerInfo.hp += 5;
}

同样能达到以上的效果。

Selection可以获取到当前选中的各类物体:

1.Selection.activeGameObject,可以获取到当前的选中的节点和资源文件中的Prefab(gameObjects是其复数形式);

2.Selection.activeObject,不仅是GameObject,cs脚本这类文件都能获取(objects是其复数形式);

3.Selection.activeTransform,只有场景中的节点才有(transforms是其复数形式);

4.Selection.activeInstanceID,Unity中的唯一id(instanceIDs是其复数形式);

5.Selection.assetGUIDs,资源的唯一ID。

Undo命令撤销:

使用Editor功能将GameObject删除了,但按Ctrl+Z却没有反应,此时便陷入了绝望,之前做的工作可能都白费了。

这时就轮到Undo类登场了:

[MenuItem("Tools/Delete This", false, 20)]
public static void Delete()
{if (Selection.activeGameObject != null){//GameObject.DestroyImmediate(Selection.activeGameObject);Undo.DestroyObjectImmediate(Selection.activeGameObject);}
}

使用Undo代替普通的删除便可以了,下面是举几个重要的方法:

// 记录当前位置
Undo.RecordObject(Selection.activeTransform, "Zero Transform Position");
Selection.activeTransform.position = Vector3.zero;// 记录添加component
Undo.AddComponent<Rigidbody>(Selection.activeGameObject);// 记录创建GameObject
var go = new GameObject();
Undo.RegisterCreatedObjectUndo(go, "Create go");// 记录设置父节点
Undo.SetTransformParent(Selection.activeTransform, tr, "Set new parent");

重要的是改变习惯,做功能的时候首先想想是否能用Undo。

几个常用的窗口小部件:

显示进度条:

[MenuItem("Tools/Show Progress Bar")]
public static void ShowBar()
{EditorUtility.DisplayProgressBar("进度条", "读取中", 0);Thread.Sleep(TimeSpan.FromSeconds(0.2f));EditorUtility.DisplayProgressBar("进度条", "读取中", 0.5f);Thread.Sleep(TimeSpan.FromSeconds(0.2f));EditorUtility.DisplayProgressBar("进度条", "读取中", 1f);Thread.Sleep(TimeSpan.FromSeconds(0.2f));EditorUtility.ClearProgressBar();
}

一个可以取消的进度条:

[MenuItem("Tools/Show Cancel Progress Bar")]
public static void ShowCancelProgressBar()
{EditorUtility.DisplayCancelableProgressBar("进度条", "读取中", 0);Thread.Sleep(TimeSpan.FromSeconds(1f));if(EditorUtility.DisplayCancelableProgressBar("进度条", "读取中", 1f))Debug.Log("取消");EditorUtility.ClearProgressBar();
}

显示小提示窗口:

[MenuItem("Tools/Show Dialog")]
public static void ShowDialog()
{EditorUtility.DisplayDialog("警告", "操作失误了", "确定");
}

显示有三个选项的窗口(值得一提的是按红叉也是最后一个选项):

[MenuItem("Tools/Show Complex Dialog")]
public static void ShowComplexDialog()
{int choice = EditorUtility.DisplayDialogComplex("三个选择", "你的性别", "男", "女", "都不是");Debug.Log("玩家的选择是:" + choice);
}

文件打开窗口:

[MenuItem("Tools/Show File Panel")]
public static void ShowFilePanel()
{string path = EditorUtility.OpenFilePanel("选择文件", "", "");Debug.Log("玩家选择了" + path);
}

文件夹窗口:

[MenuItem("Tools/Show Folder Panel")]
public static void ShowFolderPanel()
{string path = EditorUtility.OpenFolderPanel("选择路径", "", "");Debug.Log("玩家选择了" + path);
}

Unity3D Editor 编辑器扩展2 选取物体、撤销操作和窗口小部件的显示相关推荐

  1. Unity3D Editor 编辑器扩展3 Editor脚本

    Unity3D Editor 编辑器扩展3 Editor脚本 环境:Unity2017.2 语言:C# 总起: 在编辑Unity项目的时候,总不可能避免的接触到Unity自身自带的Inspector参 ...

  2. Unity Editor 编辑器扩展一 编辑器特殊文件夹及内置资源读取

    目录 目录 编辑器特殊文件夹及内置资源读取 编辑器相关文件夹 读取内置资源包 代码 Test1_1cs 代码Editor1_1cs 这个要放到Editor文件夹内 编辑器特殊文件夹及内置资源读取 使用 ...

  3. Unity3D Editor 编辑器简易教程

    Star 自定义编辑器简易教程 an introduction to custom editors 原文地址 http://catlikecoding.com/unity/tutorials/star ...

  4. Unity Editor 编辑器扩展 五 EditorGUI

    目录 创建一个窗口添加简单控件 制作一个可以渐入渐出的窗口控件 最后做一个比较炫酷的窗口 创建一个窗口,添加简单控件 在Editor创建脚本GUIWindow1如下,添加一些简单的控件,体验一下他们的 ...

  5. unity编辑器扩展——替换选择物体名字中的内容

    名字的特点: 1,有规律 2,有相同的内容 可以用这个工具,修改物体的名字,在菜单中生成的自定义目录"DCCTools/Rename" using System.Collectio ...

  6. 【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

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

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

  8. 创建自定义Widgets小部件扩展

    创建自定义Widgets小部件扩展 创建自定义Widgets小部件扩展 扩展名类型 创建一个扩展 向Qt Designer公开扩展 创建扩展工厂 访问Qt Designer的扩展管理器 创建自定义Wi ...

  9. Unity3D使用经验总结 编辑器扩展篇【转】

    一个引擎,最重要的就是工具,工具除了提升开发速度,提供可视化操作环境以外,还带了容错功能. 它使得大家的工作局限在一定的范围内,比如一个变量的配置,或者是一些类型的选择. 使用编辑器,使得既使不太明白 ...

最新文章

  1. nodejs如何利用rpc调用python
  2. 05构建之法阅读笔记之三
  3. 看了《为什么你应该写博客》有感
  4. 工程之道,解读业界最佳的深度学习推理性能优化方案
  5. Incapsula企业版测试项目
  6. 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
  7. 图片预览(适用于IE6,9,10,Firefox)
  8. C语言及程序设计提高例程-21 首尝排序——冒个泡
  9. Hibernate操作数据库步骤(包括语法)
  10. linux用户修改密码
  11. 根据开始日期,结束日期,计算出日历上有几周的方法
  12. html控制萤石云摄像头转动,怎么控制云台转动 ?
  13. Android studio - UI 界面设计(仿问卷星登陆注册界面)
  14. requestSubscribeMessage:fail can only be invoked by user TAP gesture 微信小程序调起订阅消息失败
  15. 微信小程序 输入车牌号(有新能源)
  16. 阿里大牛分享程序员5年的职业生涯指南
  17. Android应用商店上架技巧(企业版)
  18. 软件工程-数据流图+ER图绘制听课笔记
  19. 快速建站 python_Django简单快捷建站(适合做大作业)
  20. 360安全卫士的云查杀原理介绍[转]

热门文章

  1. 计算机进入低能耗休眠状态,电脑的睡眠状态是什么意思,使计算机进入睡眠状态是什么意思...
  2. 通俗讲解:什么是容器?为什么我们要使用它?
  3. safari打不开cookies_IOS safari浏览器登陆时Cookie无法保存的问题
  4. 解决Foxmail新增邮箱报错问题
  5. linux 终端进入与退出vim
  6. mysql unpivot_UNPIVOT逆透视以及动态逆透视存储过程
  7. css——宽度高度自适应
  8. 【投资】实际计算跨式期权
  9. C语言--关于形式参数与实际参数
  10. protege查询时,提示没有reasoner可用怎么解决