| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 扩展unity编辑器学习笔记 -> 正文阅读 |
|
[游戏开发]扩展unity编辑器学习笔记 |
在unity的project面板中,Asset的editor文件夹,在打包时不会进行编译进去,只有在编译器里有效,且不能赋给物体 菜单栏扩展 1.方法必须是静态的 2.如果是扩展在菜单栏的必须加上特性[MenuItem("路径/方法名"),是否有效,层级] ????????1.[menuitem("路径+方法名")] ????????2.[menuitem("路径+方法名"),bool]--验证对应的方法是否可以用 ,默认为false,为true时按钮不显示。可以用来实现按钮灰色禁用的效果,写一个返回值为bool类型的方法控制,这个方法的标签为[menuitem("需要进行判定的方法路径一致",true)],这个返回值为true时可用,为false时,指定的按钮显示灰色不可点击。???????? ????????3.[menuitem("路径+方法名"),bool,优先级]越小越在前面,从0开始 ,如果优先级差别比较大会在两个方法之间出现一条线 3.添加快捷键,在标签后面的路径中加一个空格然后写对应的快捷键,重复了会在运行时跳出提示。一般写是%9==CTRL+9 %--CTRL #--shift &--alt 上下左右-- up\down\left\right 在加载时就开始运行方法 1.方法是静态 2.前面加上特性[InitialzeOnLoadMethod] 对scene场景的修改 打开菜单栏 1.菜单栏打开的要放在[InitialzeOnLoadMethod]方法里 2.场景中的监听事件UnityEditor.SceneView.duringSceneGui,可以通过事件添加调用,实现内容可以使用一个匿名函数(需要带一个参数) 3.通过事件来检测鼠标的点击事件(Event.current != null && Event.current.button == 1 && Event.current.type == EventType.MouseUp) 4.通过rect类型存储鼠标的位置和需要显示面板大小,注意y需要进行调整,一般减100 5.通过这个方法显示菜单 EditorUtility.DisplayCustomMenu(rect类型,显示内容 GUIContent[],默认选择的下标可以是-1,选中执行的方法(object,字符串数组,选择下标),使用的数据可以为空) 6.用这个Event.current.Use();方法阻断点击事件继续往下传 通过GUI扩展视图 选择物体显示对应扩展 1.通过特性[CustomEditor(typeof(组件名))]来确定物品,这个是加给类的 2.类需要继承editor 3.重写OnSceneGUI方法,在涉及GUI时,相关GUILayout内容要写在 Handles.BeginGUI()和Handles.EndGUI()之间 在开始时固定在scene场景中 1.这种一开始就固定的需要写在带[InitialzeOnLoadMethod]的方法里 2.类需要继承editor 3.添加的内容要通过?SceneView.duringSceneGui来调用包含相关GUILayout内容的方法 3.Gizmos绘制 1.OnDrawGizmosSelected(),选中挂含有这个方法的类的物体会执行 2.?OnDrawGizmos(),只要挂上物体就会执行 //场景摄像机的图标显示实现原理 在一个物体身上的类里 添加ondrawgizmos方法 绘制一个图标(位置,“路径+物体完整的名字”) 对project场景的修改 1.扩展右键的菜单内容 1.方法必须是静态的 2.必须加上特性[MenuItem("Assets/路径/方法名"),是否有效,层级] 3.其他跟普通扩展的方法一致 2.修过project面板,比如添加一个按钮 1.修改的方法要放在[InitialzeOnLoadMethod]里 2.通过EditorApplication.projectWindowItemOnGUI方法来回调,方法可以用匿名方法和lamb来,方法需要两个参数字符串(选中物体的标识)和rect(选中物体的rect) //获得选中物体Selection.activeObject--这个是所有选中的物体都会有,但是场景里的物体没有标识的guid //AssetDatabase.GetAssetPath(Selection.activeObject)通过选中物体获得物品的路径 //AssetDatabase.AssetPathToGUID(物品路径)通过路径获得选中物品的guid(每一个创建的物体都有的标识) // AssetDatabase.DeleteAsset(路径)根据路径删除物品 //string.IsNullOrEmpty()判定这个是不是空的 //每一个文件创建都有一个对应的。mate文件创建,里面保存了 guid这种标识文件的信息 3.project的事件 1.类的继承UnityEditor.AssetModificationProcessor 2.void ?OnWillCreateAsset(string path)-创建的路径 3.string[] OnWillSaveAssets(string[] paths)-保存的路径 4.AssetMoveResult OnWillMoveAsset(string oldPath,string newPath)-返回的是一个枚举类型,?DidNotMove(可移动),FailedMove (移动失败),DidMove(不移动) 5. AssetDeleteResult OnWillDeleteAsset(string path,RemoveAssetOptions options) 6.EditorApplication.projectChanged事件,在project的物体文件改变时进行调用 4.打开其他菜单面板 1.修改的方法要放在[InitialzeOnLoadMethod]里 2.通过EditorApplication.projectWindowItemOnGUI方法来回调,方法可以用匿名方法和lamb来,方法需要两个参数字符串(选中物体的标识)和rect(选中物体的rect) 3.通过事件来检测鼠标的点击事件(Event.current != null && Event.current.button == 1 && Event.current.type == EventType.MouseUp) 4.通过这个方法显示菜单 EditorUtility.Display**Menu()方法 5.用这个Event.current.Use();方法阻断点击事件继续往下传 对Hierarchy面板扩展 扩展菜单栏 1.方法必须是静态的 2.必须加上特性[MenuItem("Gameobject/路径/方法名"),是否有效,层级] 3.Hierarchy的菜单是由Editor的一部分和Gameobject的一部分组成,所以层级需要进行调整才能显示在Hierarchy的菜单里 重写菜单 1.修改的方法要放在[InitialzeOnLoadMethod]里 2.hierarchy面板修改的回调事件是EditorApplication.hierarchyWindowItemOnGUI 这个需要的方法有两个参数(instanceID选中物体的标识,rect选中物体的rect类) 3.通过事件来检测鼠标的点击事件(Event.current != null && Event.current.button == 1 && Event.current.type == EventType.MouseUp) 4.通过这个方法显示菜单 EditorUtility.DisplayPopupMenu(rect存储的位置,“需要打开的菜单路径(即扩展菜单时写的那个)”,)方法 5.用这个Event.current.Use();方法阻断点击事件继续往下传 3.扩展面板内容(比如点击物品显示按钮/显示GUI组件) 1.修改的方法要放在[InitialzeOnLoadMethod]里 2.hierarchy面板修改的回调事件是EditorApplication.hierarchyWindowItemOnGUI 这个需要的方法有两个参数(instanceID选中物体的标识,rect选中物体的rect类) 3.用?GUILayout/GUI.进行绘制按钮 对Inspect面板扩展 扩展组件内容(添加增删改查的快捷按钮) 1.写一个类继承Editor 2.重写OnInspectorGUI(),方法应该base.OnInspectorGUI(); 3.通过特性[CustomEditor(typeof(组件名))]来确定是加在哪一个组件里的,这个是特性放在类前面 4.添加一些UGI组件 2.扩展组件的:内容 1.给类添加特性[MenuItem(“CONTEXT/路径/方法名”,)] 2.方法要静态的且有一个参数MenuCommand command,可以通过这个转换为相应的组件 3.通过转换组件进行操作 对Game场景扩展 1.普通扩展--直接使用OnGUI进行扩展 2.在未执行时显示--在类前面加特性[ExecuteInEditMode] 自己写一个面板 1.写一个类继承 EditorWindow //这个类有Awake()、Update()、OnDestroy()、OnFocus()、OnLostFocus()等方法 2.在面板上添加内容可以用OnGUI方法 3.扩展面板的:选项 ????????1.类继承一个IHasCustomMenu接口 并实现 通过参数menu.AddItem(new GUIContent(),bool,点击事件)来添加选项 ????????2.添加不可操作选项menu.AddDisabledItem 4.通过其他方法来打开这个面板 用editorwindows.getwindow<继承的类>();获得这个类,再调用类的show方法 对预览界面修改 1.写一个类继承EditorWindow 2. 先用EditorGUILayout.ObjectField(obj, typeof(Object), false);获得一个Object类型物品 ,再通过Editor.CreateEditor(obj);来获得一个 Editor 类型物品 3.使用Editor 类型物品的OnPreviewGUI(GUILayoutUtility.GetRect(400, 400), EditorStyles.label);把物品显示在预览界面 //以上操作写在OnGUI里面 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/19 17:18:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |