Unity编辑器扩展学习 转载
https://www.xuanyusong.com/archives/category/unity/unity3deditor
1
using UnityEngine; public class Test : MonoBehaviour { public Rect rect; public Texture texture; } using UnityEngine; using UnityEditor; [CustomEditor(typeof(Test))] public class MyEditor: Editor { public override void OnInspectorGUI() { Test test = (Test)target; test.rect = EditorGUILayout.RectField("窗口坐标", test.rect); test.texture = EditorGUILayout.ObjectField("增加一个贴图", test.texture, typeof(Texture), true) as Texture; } }
2
using UnityEngine; using UnityEditor; public class MyEditor: EditorWindow { private string text; private Texture texture; [MenuItem("GameObject/window")] public static void AddWindow() { Rect rect = , , , ); MyEditor window = (MyEditor)EditorWindow.GetWindowWithRect(typeof(MyEditor), rect, true, "window one"); window.Show(); } public void OnGUI() { text = EditorGUILayout.TextField("输入文字:", text); ))) { ShowNotification(new GUIContent("This is a Notification")); } ))) { this.RemoveNotification(); } EditorGUILayout.LabelField("鼠标在窗口的位置", Event.current.mousePosition.ToString()); texture = EditorGUILayout.ObjectField("添加贴图", texture, typeof(Texture), true) as Texture; ))) { Close(); } } public void OnFocus() { Debug.Log("当窗口获得焦点时调用一次"); } public void OnLostFocus() { Debug.Log("当窗口丢失焦点时调用一次"); } public void OnHierarchyChange() { Debug.Log("当Hierarchy视图中的任何对象发生改变时调用一次"); } public void OnProjectChange() { Debug.Log("当Project视图中的资源发生改变时调用一次"); } public void OnInspectorUpdate() { // Debug.Log("窗口面板的更新"); // 这里开启窗口的重绘,不然窗口信息不会刷新 this.Repaint(); } public void OnSelectionChange() { foreach (Transform t in Selection.transforms) { Debug.Log("OnSelectionChange: " + t.name); } } public void OnDestroy() { Debug.Log("当窗口关闭时调用"); } }
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Test))] public class MyEditor: Editor { public void OnSceneGUI() { Test test = (Test)target; Handles.Label(test.transform.position + Vector3.up * , test.transform.name + " : " + test.transform.position.ToString()); Handles.BeginGUI(); GUILayout.BeginArea(, , , )); if (GUILayout.Button("这是一个按钮!")) { Debug.Log("test"); } GUILayout.Label("我在编辑Scene视图"); GUILayout.EndArea(); Handles.EndGUI(); } }
using UnityEngine; using UnityEditor; public class MyEditor: Editor { [DrawGizmo(GizmoType.InSelectionHierarchy | GizmoType.NotInSelectionHierarchy)] public static void DrawGameObjectName(Transform transform, GizmoType gizmoType) { Handles.Label(transform.position, transform.gameObject.name); } }
using UnityEngine; using UnityEditor; public class MyEditor: Editor { [MenuItem("MyMenu/Do Test")] public static void Test() { Transform parent = Selection.activeGameObject.transform; Vector3 postion = parent.position; Quaternion rotation = parent.rotation; Vector3 scale = parent.localScale; parent.position = Vector3.zero; parent.rotation = Quaternion.Euler(Vector3.zero); parent.localScale = Vector3.one; Collider[] colliders = parent.GetComponentsInChildren<Collider>(); foreach (Collider child in colliders) { DestroyImmediate(child); } Vector3 center = Vector3.zero; Renderer[] renders = parent.GetComponentsInChildren<Renderer>(); foreach (Renderer child in renders) { center += child.bounds.center; } center /= parent.transform.childCount; Bounds bounds = new Bounds(center, Vector3.zero); foreach (Renderer child in renders) { bounds.Encapsulate(child.bounds); } BoxCollider boxCollider = parent.gameObject.AddComponent<BoxCollider>(); boxCollider.center = bounds.center - parent.position; boxCollider.size = bounds.size; parent.position = postion; parent.rotation = rotation; parent.localScale = scale; } }
5
using UnityEngine; using UnityEditor; using System.IO; using System.Collections.Generic; [CustomEditor(typeof(UnityEditor.DefaultAsset))] public class FolderInspector : Editor { Data data; Data selectData; void OnEnable() { if (Directory.Exists(AssetDatabase.GetAssetPath(target))) { data = new Data(); LoadFiles(data, AssetDatabase.GetAssetPath(Selection.activeObject)); } } public override void OnInspectorGUI() { if (Directory.Exists(AssetDatabase.GetAssetPath(target))) { GUI.enabled = true; EditorGUIUtility.SetIconSize(Vector2.one * ); DrawData(data); } } ) { GUIContent content = GetGUIContent(currentPath); if (content != null) { data.indent = indent; data.content = content; data.assetPath = currentPath; } foreach (var path in Directory.GetFiles(currentPath)) { content = GetGUIContent(path); if (content != null) { Data child = new Data(); child.indent = indent + ; child.content = content; child.assetPath = path; data.childs.Add(child); } } foreach (var path in Directory.GetDirectories(currentPath)) { Data childDir = new Data(); data.childs.Add(childDir); LoadFiles(childDir, path, indent + ); } } void DrawData(Data data) { if (data.content != null) { EditorGUI.indentLevel = data.indent; DrawGUIData(data); } ; i < data.childs.Count; i++) { Data child = data.childs[i]; if (child.content != null) { EditorGUI.indentLevel = child.indent; ) DrawData(child); else DrawGUIData(child); } } } void DrawGUIData(Data data) { GUIStyle style = "Label"; Rect rt = GUILayoutUtility.GetRect(data.content, style); if (data.isSelected) { EditorGUI.DrawRect(rt, Color.gray); } rt.x += ( * EditorGUI.indentLevel); if (GUI.Button(rt, data.content, style)) { if (selectData != null) { selectData.isSelected = false; } data.isSelected = true; selectData = data; Debug.Log(data.assetPath); } } GUIContent GetGUIContent(string path) { Object asset = AssetDatabase.LoadAssetAtPath(path, typeof(Object)); if (asset) { return new GUIContent(asset.name, AssetDatabase.GetCachedIcon(path)); } return null; } class Data { public bool isSelected = false; ; public GUIContent content; public string assetPath; public List<Data> childs = new List<Data>(); } }
6
using UnityEngine; using UnityEditor; using System.Collections; using System; public class MyEditor { [InitializeOnLoadMethod] static void Start() { Action OnEvent = delegate { Event e = Event.current; switch (e.type) { // case EventType.mouseDown: // Debug.Log ("mousedown"); // e.Use (); // break; // case EventType.mouseUp: // Debug.Log ("mouseup"); // e.Use (); // break; // case EventType.MouseMove: // Debug.Log ("move"); // e.Use (); // break; case EventType.DragPerform: Debug.Log("DragPerform"); e.Use(); break; case EventType.DragUpdated: Debug.Log("DragUpdated"); e.Use(); break; case EventType.DragExited: Debug.Log("DragExited"); e.Use(); break; } }; EditorApplication.hierarchyWindowItemOnGUI = delegate (int instanceID, Rect selectionRect) { OnEvent(); }; EditorApplication.projectWindowItemOnGUI = delegate (string guid, Rect selectionRect) { OnEvent(); }; } }
7
using UnityEngine; using UnityEditor; using System.Collections; public class MyHierarchyMenu { [MenuItem("Window/Test/yusong")] static void Test() { } [MenuItem("Window/Test/momo")] static void Test1() { } [MenuItem("Window/Test/雨松/MOMO")] static void Test2() { } [InitializeOnLoadMethod] static void StartInitializeOnLoadMethod() { EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyGUI; } static void OnHierarchyGUI(int instanceID, Rect selectionRect) { if (Event.current != null && selectionRect.Contains(Event.current.mousePosition) && Event.current.button == && Event.current.type <= EventType.MouseUp) { GameObject selectedGameObject = EditorUtility.InstanceIDToObject(instanceID) as GameObject; //这里可以判断selectedGameObject的条件 if (selectedGameObject.name == "SceneRoot") { Vector2 mousePosition = Event.current.mousePosition; EditorUtility.DisplayPopupMenu(, ), "Window/Test", null); Event.current.Use(); } } } }
using UnityEngine; using UnityEditor; using System.Collections; using System.Reflection; using UnityEngine.Profiling; public class MyHierarchyMenu { [MenuItem("1/1")] public static void menu() { Texture target = Selection.activeObject as Texture; var type = System.Reflection.Assembly.Load("UnityEditor.dll").GetType("UnityEditor.TextureUtil"); //var type = Types.GetType("UnityEditor.TextureUtil", "UnityEditor.dll"); MethodInfo methodInfo = type.GetMethod("GetStorageMemorySize", BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public); Debug.Log("内存占用:" + EditorUtility.FormatBytes(Profiler.GetRuntimeMemorySizeLong(Selection.activeObject))); Debug.Log("硬盘占用:" + EditorUtility.FormatBytes((int)methodInfo.Invoke(null, new object[] { target }))); } }
Unity编辑器扩展学习 转载的更多相关文章
- unity编辑器扩展学习
扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...
- Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject Unity编辑器扩展 Chapt ...
- Unity编辑器扩展chapter1
Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...
- Unity 编辑器扩展 场景视图内控制对象
http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...
- unity 编辑器扩展简单入门
unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...
- Unity编辑器扩展Texture显示选择框
学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...
- Unity 编辑器扩展
自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...
- Unity3d编辑器扩展学习笔记
编辑器扩展 1.添加菜单栏:把特性应用于静态方法 参数1:菜单名的空格后面是定义快捷键(单符号得用"_"开头,组合键%=Ctrl,#=Shift,&=Alt) 参数2:通过 ...
- Unity编辑器扩展
在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...
随机推荐
- <Stack> (高频)394 ( 高频)224
394. Decode String 四种情况: 1. 数字,把之前有的数字乘以10再加本数字 2. ' [ ', 入口, 把之前的数字压入栈中并num归零. 3. ' ] ' ,出口,归零.用dfs ...
- 用arthas的watch方法观察执行方法的输入输出
watch 的参数比较多,主要是因为它能在 4 个不同的场景观察对象 参数名称 参数说明 class-pattern 类名表达式匹配 method-pattern 方法名表达式匹配 express 观 ...
- beego安装错误处理
1. 安装beego时无法安装go依赖包 解决办法: $vim ~/.bashrc export GOPROXY=https://goproxy.io $source ~/.bashrc$go get ...
- 学习workerman之前需要知道的几种php回调写法
在workerman中会经常使用,我们先写一个回调函数,当某个行为被触发后使用该函数处理相关逻辑. 在PHP中最常用的几种回调写法如下 匿名函数做为回调 匿名函数(Anonymous function ...
- postman请求数据库方法(Omysql)
一.github 地址: https://github.com/liyinchigithub/Omysql 二.效果 三.使用方式 如果你电脑已经安装配置 Git.node 环境,可以直接按下面步骤进 ...
- PHP fastcgi_finish_request 方法
本文介绍,PHP运行在FastCGI模式时,FPM提供的方法:fastcgi_finish_request. 在说这个方法之前,我们先了解PHP有哪些常用的运行模式? PHP运行模式 CGI 通用网关 ...
- NOI2019退役记 upd:2019.12.1
(我把原来写的东西全部删掉了) AFO. 我退役了,\(\mbox{yyb}\)退役了. 至少,在接下来的日子里,我得投身到文化课,度过快乐的高三生活了. 这两年的\(OI\)生涯给了我很多,让我学会 ...
- 常见跨域解决方案以及Ocelot 跨域配置
常见跨域解决方案以及Ocelot 跨域配置 Intro 我们在使用前后端分离的模式进行开发的时候,如果前端项目和api项目不是一个域名下往往会有跨域问题.今天来介绍一下我们在Ocelot网关配置的跨域 ...
- OpenGL光照3:光源
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- python网络爬虫进阶之HTTP原理,爬虫的基本原理,Cookies和代理介绍
目录 一.HTTP基本原理 (一)URI和URL (二)超文本 (三)HTTP和HTTPS (四)HTTP请求过程 (五)请求 1.请求方法 2.请求的网址 3.请求头 4.请求体 (六)响应 1.响 ...