Unity小知识 大智慧 博客主页https://xiaoy.blog.csdn.net 本文由呆呆敲代码的小Y原创首发于CSDN 学习专栏推荐Unity系统学习专栏 游戏制作专栏推荐游戏制作Unity实战100例专栏推荐Unity 实战100例 教程 欢迎点赞 收藏 ⭐留言 如有错误敬请指正 未来很长值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------Unity实用技巧学习Unity编辑器扩展常用方法一、自定义 InspectorInspector 面板自定义 Inspector 让你可以更好地控制和展示 MonoBehaviour 或 ScriptableObject 上的数据。可以通过实现 Editor 类来定制 Inspector 面板。usingUnityEditor;usingUnityEngine;[CustomEditor(typeof(MyScript))]publicclassMyScriptEditor:Editor{SerializedPropertyweightProp;privatevoidOnEnable(){weightPropserializedObject.FindProperty(weight);}publicoverridevoidOnInspectorGUI(){MyScriptmyScript(MyScript)target;// 自定义显示字段EditorGUILayout.LabelField(Custom Label);myScript.heightEditorGUILayout.IntField(身高,myScript.height);// 添加自定义按钮if(GUILayout.Button(Reset Height)){myScript.height100;}// 添加自定义滑动条EditorGUILayout.IntSlider(weightProp,0,100,newGUIContent(体重));if(!weightProp.hasMultipleDifferentValues)//当该值相同的时候才显示ProgressBar{ProgressBar(weightProp.intValue/100.0f,体重条);}// 绘制默认InspectorDrawDefaultInspector();}privatevoidProgressBar(floatvalue,stringstr){RectrectGUILayoutUtility.GetRect(18,18,TextField);EditorGUI.ProgressBar(rect,value,str);EditorGUILayout.Space();}}二、Editor Window自定义编辑器窗口自定义编辑器窗口可以让你创建独立的、功能强大的工具面板增强项目的可操作性。例如你可以创建一个资源管理器、调试窗口、关卡设计工具等。usingUnityEditor;usingUnityEngine;publicclassEditorCreatTest:EditorWindow{publicstringName;publicfloatHP;publicfloatSP;publicfloatATK;[SerializeField]privatefloattotalCombat;[MenuItem(YYY/CreateWindow)]staticvoidInit(){EditorWindowwindowGetWindow(typeof(EditorCreatTest),false,编辑器测试窗口);window.Show();}privatevoidOnGUI(){NameEditorGUILayout.TextField(名字,Name);HPEditorGUILayout.FloatField(血量,HP);SPEditorGUILayout.FloatField(蓝量,SP);ATKEditorGUILayout.FloatField(攻击力,ATK);totalCombatEditorGUILayout.FloatField(总战力,totalCombat);if(GUI.Button(newRect(0,100,400,50),计算总战力)){totalCombatHPSPATK;}}}三、PropertyDrawer通过实现 PropertyDrawer你可以自定义如何在 Inspector 中显示特定类型的数据。这对于自定义属性如枚举、颜色、Vector 等特别有用。usingUnityEditor;usingUnityEngine;publicclassRangeAttribute:PropertyAttribute{publicfloatmin;publicfloatmax;publicRangeAttribute(floatmin,floatmax){this.minmin;this.maxmax;}}[CustomPropertyDrawer(typeof(RangeAttribute))]publicclassRangeDrawer:PropertyDrawer{publicoverridevoidOnGUI(Rectposition,SerializedPropertyproperty,GUIContentlabel){RangeAttributerange(RangeAttribute)attribute;EditorGUI.Slider(position,property,range.min,range.max,label);}}四、Asset Database资源管理Unity 的 AssetDatabase 提供了强大的 API 用于管理和操作资源如创建、删除、导入资源等。你可以使用它来实现批量操作资源例如批量更改材质、模型或纹理等。usingUnityEditor;usingUnityEngine;publicclassAssetManager:EditorWindow{[MenuItem(Tools/图片批量重命名)]publicstaticvoidBatchRenameTextures(){string[]texturesAssetDatabase.FindAssets(t:Texture,newstring[]{Assets/Textures});foreach(stringguidintextures){stringassetPathAssetDatabase.GUIDToAssetPath(guid);Texture2DtextureAssetDatabase.LoadAssetAtPathTexture2D(assetPath);stringnewNameNew_texture.name;AssetDatabase.RenameAsset(assetPath,newName);}AssetDatabase.SaveAssets();}}五、Undo System撤销操作Unity中的Undo System撤销系统是一个用于编辑器环境下的重要功能它允许用户撤销Undo和重做Redo对场景、游戏对象、组件、资源等所做的修改。这一机制极大地提升了开发效率和安全性使得在编辑过程中可以轻松回退误操作避免手动恢复的麻烦。1.记录对象状态修改当需要修改对象的某个属性如位置、材质、自定义脚本的字段时应在修改前调用Undo.RecordObject将对象的当前状态记录下来。usingUnityEditor;usingUnityEngine;publicclassMyEditorTool:EditorWindow{[MenuItem(Tools/My Tool)]staticvoidShowWindow(){GetWindowMyEditorTool();}voidOnGUI(){if(GUILayout.Button(Move Selected Object)){foreach(GameObjectobjinSelection.gameObjects){// 记录对象修改前的状态Undo.RecordObject(obj.transform,Move Object);obj.transform.positionVector3.one;}}}}2.记录完整的对象层次结构修改如果修改会影响对象的子对象或整个层次结构例如移动一个父对象可以使用Undo.RegisterFullObjectHierarchyUndo来记录整个层级的状态。Undo.RegisterFullObjectHierarchyUndo(selectedGameObject,Move Parent);3.创建或删除对象删除对象使用Undo.DestroyObjectImmediate而不是直接的DestroyImmediate这样删除操作可以被撤销。创建对象使用Undo.RegisterCreatedObjectUndo在创建后注册新对象以便撤销时能正确移除它。// 删除对象Undo.DestroyObjectImmediate(obj);// 创建对象GameObjectnewObjnewGameObject(New Object);Undo.RegisterCreatedObjectUndo(newObj,Create Object);4.添加或移除组件添加组件使用Undo.AddComponent它会自动为添加操作注册撤销。移除组件需要先记录对象状态再移除组件。// 添加组件自动支持撤销RigidbodyrbUndo.AddComponentRigidbody(gameObject);// 移除组件ComponentcompgameObject.GetComponentRigidbody();if(comp!null){Undo.DestroyObjectImmediate(comp);}5.组合多个操作为一个撤销步骤有时一个功能涉及多个修改为了用户方便可以将它们组合成一个撤销步骤组。使用Undo.IncrementCurrentGroup、Undo.SetCurrentGroupName等来管理组。// 开始一个新的撤销组Undo.IncrementCurrentGroup();Undo.SetCurrentGroupName(Complex Operation);// 执行多个操作每个操作都记录撤销Undo.RecordObject(obj1,Modify 1);obj1.someValue10;Undo.RecordObject(obj2,Modify 2);obj2.someValue20;// 完成组之后CtrlZ会一次性撤销这两个修改Undo.CollapseUndoOperations(Undo.GetCurrentGroup());6.在自定义Inspector或EditorWindow中集成在自定义编辑器界面中任何对SerializedProperty的修改通过serializedObject.Update()和serializedObject.ApplyModifiedProperties()也会自动支持撤销因为SerializedObject内部已经集成了Undo系统。但若直接修改对象的公开字段仍需手动调用Undo.RecordObject。六、场景 Gizmos场景视图中显示自定义图标或标记可以通过 Gizmos 在场景视图中绘制自定义标记比如显示敌人、道具的位置或绘制调试信息。usingUnityEditor;usingUnityEngine;publicclassCustomGizmos:MonoBehaviour{privatevoidOnDrawGizmos(){Debug.Log(持续调用);Gizmos.colorColor.green;//改变线框的颜色Gizmos.DrawWireCube(transform.position,newVector3(3,3,3));//正方体虚线框Gizmos.DrawWireSphere(transform.position,5f);//球体虚线框Gizmos.DrawCube(transform.position,newVector3(3,3,3));//正方体线框Gizmos.DrawSphere(transform.position,5f);//球体线框}privatevoidOnDrawGizmosSelected(){Debug.Log(selected,只有物体选中后调用);}}七、EditorApplication常用事件EditorApplication是 Unity 编辑器扩展开发中的核心类它就像是用户与 Unity 编辑器本身进行交互的遥控器和监控器。API描述EditorApplication.update每帧调用适合持续性的编辑器任务。EditorApplication.delayCall延迟到当前帧结束后执行一次类似 Invoke适合一次性推迟操作。EditorApplication.quitting编辑器即将退出时触发用于执行清理工作。EditorApplication.pauseStateChange当编辑器播放模式暂停状态变化时触发。某些工具需要在编辑器启动时就运行可以在静态构造函数或 InitializeOnLoad 特性标记的类中注册回调。usingUnityEditor;usingUnityEngine;[InitializeOnLoad]publicstaticclassBackgroundProcessor{staticBackgroundProcessor(){EditorApplication.updateOnEditorUpdate;}privatestaticvoidOnEditorUpdate(){// 执行后台处理但要注意性能// 例如检查资源变化}}资料白嫖技术互助学习路线指引点击解锁知识定位人群定位 Unity系统学习专栏入门级本专栏从Unity入门开始学习快速达到Unity的入门水平 Unity实战类项目进阶级计划制作Unity的 100个实战案例助你进入Unity世界争取做最全的Unity原创博客大全。❤️ 游戏制作专栏难度偏高分享学习一些Unity成品的游戏Demo和其他语言的小游戏 游戏爱好者万人社区互助/吹水数万人游戏爱好者社区聊天互助白嫖奖品 Unity100个实用技能Unity查漏补缺针对一些Unity中经常用到的一些小知识和技能进行学习介绍核心目的就是让我们能够快速学习Unity的知识以达到查漏补缺