网站服务流程,企业建设网站 入账,太平鸟品牌门户网站建设,绍兴高端网站设计更新日期#xff1a;2025年1月23日。 Github源码#xff1a;[点我获取源码] Gitee源码#xff1a;[点我获取源码] 索引 开发编辑器工具MouseRayTarget焦点视角Collider线框Assembly Viewer搜索程序集ILSpy反编译程序集搜索GizmosElement类找到Gizmos菜单找到Gizmos窗口分析A… 更新日期2025年1月23日。 Github源码[点我获取源码] Gitee源码[点我获取源码] 索引 开发编辑器工具MouseRayTarget焦点视角Collider线框Assembly Viewer搜索程序集ILSpy反编译程序集搜索GizmosElement类找到Gizmos菜单找到Gizmos窗口分析AnnotationWindow类 开始编写工具 开发编辑器工具
本章我将借助Assembly Viewer工具和ILSpy工具依靠反射开发一个Unity编辑器工具此为快速开发编辑器工具的一个示例。
此工具的用途一键隐藏/显示脚本的Gizmos控件还Scene视图一个干净清爽。
MouseRayTarget焦点视角
最新的MouseRayTarget组件新增了参数Look At Angle用于在自由视角模式下摄像机焦点到此物体时所进入的视角参数 该参数同时会借助Gizmos控件功能在Scene视图模拟显示摄像机注视他时可能处于的位置 如果选中的物体多了或者选中了根物体这些Gizmos控件就有点混乱了 Collider线框
而且MouseRayTarget组件一般为了配合鼠标点击都会同时挂载碰撞器Collider组件Collider组件的线框也是干扰画面的最大元凶之一在一些大场景里面尤其明显 虽然我们可以在Scene视图右上方的Gizmos菜单里面找到并隐藏任意组件、脚本的Gizmos但这个过程略显繁琐 我们所想的是在需要时一键显示Gizmos不需要时一键隐藏Gizmos显示与隐藏的切换越快捷、简便越好。
为此我们准备此编辑器工具的开发。
Assembly Viewer搜索程序集
为了显示和隐藏Gizmos我们不可能自行开发此功能所以只能借助上图位于Scene视图的Gizmos菜单。
打开Assembly Viewer程序集搜索工具 Gizmos菜单作为一个编辑器窗口其必定位于UnityEditor程序集中所以我们直接在UnityEditor程序集中搜索关键字Gizmos 经过一番搜索最终在UnityEditor.SceneViewModule中搜到了一个可疑目标 SceneView顾名思义即为Scene视图且这个GizmosElement类继承至EditorToolbarDropdownToggle从名字上看很像是编辑器工具栏下拉菜单OK了我们的切入点就选他了。
接下来我们点击Open in ILSpy按钮在ILSpy中反编译这个程序集 ILSpy反编译程序集
搜索GizmosElement类
反编译成功后我们首先搜索切入点GizmosElement类 找到Gizmos菜单
反编译该类后查看源码第一眼就找到了我们想要的东西 此工具栏提示正好与编辑器中的对应说明这个类正是Gizmos菜单 找到Gizmos窗口
点击Gizmos菜单会打开Gizmos窗口所以我们看菜单的点击事件 很明显这句话便是打开Gizmos窗口
AnnotationWindow.ShowAtPosition(base.worldBound, false);AnnotationWindow便是我们要找的Gizmos窗口。
分析AnnotationWindow类
通过分析AnnotationWindow类我们知道了一个GizmoInfo对象即对应了一个组件、脚本的Gizmos状态。
其中的如下2个GizmoInfo集合正对应了AnnotationWindow窗口中的组件Builtin和脚本Script 再进一步分析其中的SetGizmoState方法即可设置一个GizmoInfo对象的开启状态也即是Gizmos控件的开启状态 开始编写工具
万事俱备只欠东风接下来就是编码环节熟悉反射的同学脑海中可能已经构建了一套完整的伪代码事实上反射的代码也极其简单所以我们就直接贴出源码了 protected void ShowOrHideGizmos(string className, bool isBuiltin){//反射出AnnotationWindow类Type type Type.GetType(UnityEditor.AnnotationWindow,UnityEditor);//根据是否为内置组件反射出对应的GizmoInfo集合FieldInfo annotations type.GetField(isBuiltin ? m_BuiltinAnnotations : m_ScriptAnnotations, BindingFlags.Instance | BindingFlags.NonPublic);//反射出打开AnnotationWindow窗口的方法MethodInfo showAtPosition type.GetMethod(ShowAtPosition, BindingFlags.Static | BindingFlags.NonPublic);//反射出设置Gizmos状态的方法MethodInfo setGizmoState type.GetMethod(SetGizmoState, BindingFlags.Instance | BindingFlags.NonPublic);//第一步先打开AnnotationWindow窗口显示位置无所谓我们立即会关闭他showAtPosition.Invoke(null, new object[] { Rect.zero, false });EditorWindow window EditorWindow.GetWindow(type);//第二步反射出GizmoInfo集合的真实对象ListGizmoInfo gizmoInfos annotations.GetValue(window) as ListGizmoInfo;//第三步找到我们需要设置Gizmos状态的类的GizmoInfo对象GizmoInfo gizmoInfo gizmoInfos.Find((g) { return g.name className; });//第三步改变Gizmos激活状态显示变隐藏隐藏变显示gizmoInfo.gizmoEnabled !gizmoInfo.gizmoEnabled;//第四步调用设置Gizmos状态的方法setGizmoState.Invoke(window, new object[] { gizmoInfo, true });//第五步关闭窗口window.Close();}如上方法我们将其放到MouseRayTargetBase类中然后在检视面板写一个按钮调用他即可 [Button(Show/Hide This Gizmos, ButtonAttribute.EnableMode.Always)]protected void ShowOrHideThisGizmos(){ShowOrHideGizmos(GetType().Name, false);}同时控制Collider组件的线框显示也丢在这里 [Button(Show/Hide Collider Gizmos, ButtonAttribute.EnableMode.Always)]protected void ShowOrHideColliderGizmos(){Collider collider GetComponentCollider();if (collider){ShowOrHideGizmos(collider.GetType().Name, true);}}最后我们来看看效果
文章转载自: http://www.morning.hmjasw.com.gov.cn.hmjasw.com http://www.morning.cwqrj.cn.gov.cn.cwqrj.cn http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn http://www.morning.tstkr.cn.gov.cn.tstkr.cn http://www.morning.mljtx.cn.gov.cn.mljtx.cn http://www.morning.rsxw.cn.gov.cn.rsxw.cn http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn http://www.morning.lzdbb.cn.gov.cn.lzdbb.cn http://www.morning.kmqlf.cn.gov.cn.kmqlf.cn http://www.morning.gnhsg.cn.gov.cn.gnhsg.cn http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn http://www.morning.tdmr.cn.gov.cn.tdmr.cn http://www.morning.qfqld.cn.gov.cn.qfqld.cn http://www.morning.txmlg.cn.gov.cn.txmlg.cn http://www.morning.ghccq.cn.gov.cn.ghccq.cn http://www.morning.qnxkm.cn.gov.cn.qnxkm.cn http://www.morning.mwmtk.cn.gov.cn.mwmtk.cn http://www.morning.wdprz.cn.gov.cn.wdprz.cn http://www.morning.hptbp.cn.gov.cn.hptbp.cn http://www.morning.jyznn.cn.gov.cn.jyznn.cn http://www.morning.hghhy.cn.gov.cn.hghhy.cn http://www.morning.bswxt.cn.gov.cn.bswxt.cn http://www.morning.klrpm.cn.gov.cn.klrpm.cn http://www.morning.amonr.com.gov.cn.amonr.com http://www.morning.lhytw.cn.gov.cn.lhytw.cn http://www.morning.mrkbz.cn.gov.cn.mrkbz.cn http://www.morning.lizimc.com.gov.cn.lizimc.com http://www.morning.ssjry.cn.gov.cn.ssjry.cn http://www.morning.pqchr.cn.gov.cn.pqchr.cn http://www.morning.rqrh.cn.gov.cn.rqrh.cn http://www.morning.lhztj.cn.gov.cn.lhztj.cn http://www.morning.jcfdk.cn.gov.cn.jcfdk.cn http://www.morning.lkmks.cn.gov.cn.lkmks.cn http://www.morning.kxbry.cn.gov.cn.kxbry.cn http://www.morning.pzpj.cn.gov.cn.pzpj.cn http://www.morning.xknsn.cn.gov.cn.xknsn.cn http://www.morning.gqjzp.cn.gov.cn.gqjzp.cn http://www.morning.kpbgp.cn.gov.cn.kpbgp.cn http://www.morning.rhkq.cn.gov.cn.rhkq.cn http://www.morning.xzlp.cn.gov.cn.xzlp.cn http://www.morning.saastob.com.gov.cn.saastob.com http://www.morning.qwmdx.cn.gov.cn.qwmdx.cn http://www.morning.pjwml.cn.gov.cn.pjwml.cn http://www.morning.wbqk.cn.gov.cn.wbqk.cn http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn http://www.morning.kxnnh.cn.gov.cn.kxnnh.cn http://www.morning.xswrb.cn.gov.cn.xswrb.cn http://www.morning.nbgfz.cn.gov.cn.nbgfz.cn http://www.morning.mnslh.cn.gov.cn.mnslh.cn http://www.morning.kpmxn.cn.gov.cn.kpmxn.cn http://www.morning.dmhs.cn.gov.cn.dmhs.cn http://www.morning.rszbj.cn.gov.cn.rszbj.cn http://www.morning.rxyz.cn.gov.cn.rxyz.cn http://www.morning.ffcsr.cn.gov.cn.ffcsr.cn http://www.morning.msbmp.cn.gov.cn.msbmp.cn http://www.morning.tkrdg.cn.gov.cn.tkrdg.cn http://www.morning.monstercide.com.gov.cn.monstercide.com http://www.morning.kngx.cn.gov.cn.kngx.cn http://www.morning.hqqpy.cn.gov.cn.hqqpy.cn http://www.morning.benqc.com.gov.cn.benqc.com http://www.morning.pclgj.cn.gov.cn.pclgj.cn http://www.morning.qcygd.cn.gov.cn.qcygd.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.mjyrg.cn.gov.cn.mjyrg.cn http://www.morning.cmfkp.cn.gov.cn.cmfkp.cn http://www.morning.jykzy.cn.gov.cn.jykzy.cn http://www.morning.ktmbr.cn.gov.cn.ktmbr.cn http://www.morning.hffjj.cn.gov.cn.hffjj.cn http://www.morning.mnygn.cn.gov.cn.mnygn.cn http://www.morning.iznek.com.gov.cn.iznek.com http://www.morning.rkrl.cn.gov.cn.rkrl.cn http://www.morning.qznkn.cn.gov.cn.qznkn.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.coatingonline.com.cn.gov.cn.coatingonline.com.cn http://www.morning.ndngj.cn.gov.cn.ndngj.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.ndyrb.com.gov.cn.ndyrb.com http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.yswxq.cn.gov.cn.yswxq.cn http://www.morning.wrlxt.cn.gov.cn.wrlxt.cn