Unity3D Editor 编辑器扩展2 选取物体、撤销操作和窗口小部件的显示
环境: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 选取物体、撤销操作和窗口小部件的显示相关推荐
- Unity3D Editor 编辑器扩展3 Editor脚本
Unity3D Editor 编辑器扩展3 Editor脚本 环境:Unity2017.2 语言:C# 总起: 在编辑Unity项目的时候,总不可能避免的接触到Unity自身自带的Inspector参 ...
- Unity Editor 编辑器扩展一 编辑器特殊文件夹及内置资源读取
目录 目录 编辑器特殊文件夹及内置资源读取 编辑器相关文件夹 读取内置资源包 代码 Test1_1cs 代码Editor1_1cs 这个要放到Editor文件夹内 编辑器特殊文件夹及内置资源读取 使用 ...
- Unity3D Editor 编辑器简易教程
Star 自定义编辑器简易教程 an introduction to custom editors 原文地址 http://catlikecoding.com/unity/tutorials/star ...
- Unity Editor 编辑器扩展 五 EditorGUI
目录 创建一个窗口添加简单控件 制作一个可以渐入渐出的窗口控件 最后做一个比较炫酷的窗口 创建一个窗口,添加简单控件 在Editor创建脚本GUIWindow1如下,添加一些简单的控件,体验一下他们的 ...
- unity编辑器扩展——替换选择物体名字中的内容
名字的特点: 1,有规律 2,有相同的内容 可以用这个工具,修改物体的名字,在菜单中生成的自定义目录"DCCTools/Rename" using System.Collectio ...
- 【Unity3D编辑器扩展】Unity3D中实现Text的字体的替换
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...
- Unity 编辑器扩展 场景视图内控制对象
http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...
- 创建自定义Widgets小部件扩展
创建自定义Widgets小部件扩展 创建自定义Widgets小部件扩展 扩展名类型 创建一个扩展 向Qt Designer公开扩展 创建扩展工厂 访问Qt Designer的扩展管理器 创建自定义Wi ...
- Unity3D使用经验总结 编辑器扩展篇【转】
一个引擎,最重要的就是工具,工具除了提升开发速度,提供可视化操作环境以外,还带了容错功能. 它使得大家的工作局限在一定的范围内,比如一个变量的配置,或者是一些类型的选择. 使用编辑器,使得既使不太明白 ...
最新文章
- nodejs如何利用rpc调用python
- 05构建之法阅读笔记之三
- 看了《为什么你应该写博客》有感
- 工程之道,解读业界最佳的深度学习推理性能优化方案
- Incapsula企业版测试项目
- 【CSS3】 理解CSS3 transform中的Matrix(矩阵)
- 图片预览(适用于IE6,9,10,Firefox)
- C语言及程序设计提高例程-21 首尝排序——冒个泡
- Hibernate操作数据库步骤(包括语法)
- linux用户修改密码
- 根据开始日期,结束日期,计算出日历上有几周的方法
- html控制萤石云摄像头转动,怎么控制云台转动 ?
- Android studio - UI 界面设计(仿问卷星登陆注册界面)
- requestSubscribeMessage:fail can only be invoked by user TAP gesture 微信小程序调起订阅消息失败
- 微信小程序 输入车牌号(有新能源)
- 阿里大牛分享程序员5年的职业生涯指南
- Android应用商店上架技巧(企业版)
- 软件工程-数据流图+ER图绘制听课笔记
- 快速建站 python_Django简单快捷建站(适合做大作业)
- 360安全卫士的云查杀原理介绍[转]