【unity小技巧】unity常用的编辑器扩展

news/2024/11/24 19:43:04/

文章目录

      • 1. **自定义 Inspector(Inspector 面板)**
        • 示例:
      • 2. **Editor Window(自定义编辑器窗口)**
        • 示例:
      • 3. **PropertyDrawer(自定义属性绘制)**
        • 示例:
      • 4. **菜单项(MenuItem)**
        • 示例:
      • 5. **Asset Database(资源管理)**
        • 示例:
      • 6. **Undo System(撤销操作)**
        • 示例:
      • 7. **场景 Gizmos(场景视图中显示自定义图标或标记)**
        • 示例:
      • 8. **自动化工具(脚本化任务)**
        • 示例:
      • 9. **Debugging Tools(调试工具)**
        • 示例:
      • 10. **自定义工具栏按钮**
        • 示例:
  • 完结

在 Unity 开发中,编辑器扩展是增强开发效率、定制工作流的重要工具。通过编写自定义的编辑器扩展,你可以简化复杂的任务、优化工作流程,并在 Unity 编辑器中创建自己的工具面板、按钮等。下面是一些常用的 Unity 编辑器扩展和技术:

1. 自定义 Inspector(Inspector 面板)

自定义 Inspector 让你可以更好地控制和展示 MonoBehaviour 或 ScriptableObject 上的数据。你可以通过实现 Editor 类来定制 Inspector 面板。

示例:
using UnityEditor;
using UnityEngine;[CustomEditor(typeof(MyScript))]
public class MyScriptEditor : Editor
{public override void OnInspectorGUI(){MyScript myScript = (MyScript)target;// 自定义显示字段EditorGUILayout.LabelField("Custom Label");myScript.health = EditorGUILayout.IntField("Health", myScript.health);// 添加自定义按钮if (GUILayout.Button("Reset Health")){myScript.health = 100;}// 绘制默认InspectorDrawDefaultInspector();}
}

2. Editor Window(自定义编辑器窗口)

自定义编辑器窗口可以让你创建独立的、功能强大的工具面板,增强项目的可操作性。例如,你可以创建一个资源管理器、调试窗口、关卡设计工具等。

示例:
using UnityEditor;
using UnityEngine;public class MyEditorWindow : EditorWindow
{[MenuItem("Window/My Custom Window")]public static void ShowWindow(){GetWindow<MyEditorWindow>("Custom Window");}private void OnGUI(){GUILayout.Label("This is a custom editor window", EditorStyles.boldLabel);if (GUILayout.Button("Do Something")){Debug.Log("Button clicked!");}}
}

3. PropertyDrawer(自定义属性绘制)

通过实现 PropertyDrawer,你可以自定义如何在 Inspector 中显示特定类型的数据。这对于自定义属性(如枚举、颜色、Vector 等)特别有用。

示例:
using UnityEditor;
using UnityEngine;public class RangeAttribute : PropertyAttribute
{public float min;public float max;public RangeAttribute(float min, float max){this.min = min;this.max = max;}
}[CustomPropertyDrawer(typeof(RangeAttribute))]
public class RangeDrawer : PropertyDrawer
{public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){RangeAttribute range = (RangeAttribute)attribute;EditorGUI.Slider(position, property, range.min, range.max, label);}
}

4. 菜单项(MenuItem)

MenuItem 可以让你在 Unity 编辑器菜单中添加自定义选项,方便执行自定义功能。可以为编辑器菜单添加快捷键。

示例:
using UnityEditor;
using UnityEngine;public class MyEditorMenu : Editor
{[MenuItem("Tools/Print Hello %#h")]  // 快捷键Ctrl+Shift+Hprivate static void PrintHello(){Debug.Log("Hello, Unity!");}
}

5. Asset Database(资源管理)

Unity 的 AssetDatabase 提供了强大的 API 用于管理和操作资源(如创建、删除、导入资源等)。你可以使用它来实现批量操作资源,例如批量更改材质、模型或纹理等。

示例:
using UnityEditor;
using UnityEngine;public class AssetManager : EditorWindow
{[MenuItem("Tools/Batch Rename Textures")]public static void BatchRenameTextures(){string[] textures = AssetDatabase.FindAssets("t:Texture", new string[] { "Assets/Textures" });foreach (string guid in textures){string assetPath = AssetDatabase.GUIDToAssetPath(guid);Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);string newName = "New_" + texture.name;AssetDatabase.RenameAsset(assetPath, newName);}AssetDatabase.SaveAssets();}
}

6. Undo System(撤销操作)

使用 Undo 类,你可以让编辑器的操作支持撤销功能。Unity 本身已经内置了撤销功能,但你也可以自定义一些操作来与撤销功能兼容。

示例:
using UnityEditor;
using UnityEngine;public class UndoExample : MonoBehaviour
{private void Start(){Undo.RecordObject(this, "Change Position");transform.position = new Vector3(0, 5, 0);}
}

7. 场景 Gizmos(场景视图中显示自定义图标或标记)

你可以通过 Gizmos 在场景视图中绘制自定义标记,比如显示敌人、道具的位置,或绘制调试信息。

示例:
using UnityEditor;
using UnityEngine;public class CustomGizmos : MonoBehaviour
{private void OnDrawGizmos(){Gizmos.color = Color.red;Gizmos.DrawSphere(transform.position, 0.5f); // 在物体位置绘制一个红色的球体}
}

8. 自动化工具(脚本化任务)

通过编写脚本化任务(例如批量导入、导出、构建管理等),你可以提高开发效率。比如,每次修改某个资源时自动进行一些操作,或者批量替换场景中的某些元素。

示例:
using UnityEditor;
using UnityEngine;public class BuildScript : EditorWindow
{[MenuItem("Tools/Build Project")]public static void BuildProject(){string[] levels = { "Assets/Scenes/MainScene.unity" }; // 需要构建的场景BuildPipeline.BuildPlayer(levels, "Build/ProjectBuild.exe", BuildTarget.StandaloneWindows, BuildOptions.None);}
}

9. Debugging Tools(调试工具)

自定义的调试工具,比如日志输出、性能计数器等,可以帮助你在开发过程中更高效地找到问题并进行优化。

示例:
using UnityEditor;
using UnityEngine;public class Debugger : EditorWindow
{[MenuItem("Window/Debugger")]public static void ShowWindow(){GetWindow<Debugger>("Debugger");}private void OnGUI(){GUILayout.Label("Custom Debugger", EditorStyles.boldLabel);if (GUILayout.Button("Start Debugging")){Debug.Log("Debugging started...");}}
}

10. 自定义工具栏按钮

你可以在 Unity 编辑器的工具栏中添加自定义按钮,执行特定的操作,提升工作效率。

示例:
using UnityEditor;
using UnityEngine;[InitializeOnLoad]
public class ToolbarButton
{static ToolbarButton(){// 注册按钮EditorApplication.update += OnEditorUpdate;}private static void OnEditorUpdate(){if (GUILayout.Button("Custom Action")){Debug.Log("Button pressed!");}}
}

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.ppmy.cn/news/1549615.html

相关文章

修改仓库中子模块并推送到远程仓库的指定分支

因为现在修改的是仓库的子模块的东西&#xff0c;我们要先提交子模块&#xff0c;然后在提交主题仓库。 提交的时候我们要 首先&#xff0c;进入 XGBDIM 子模块目录。 cd XGBDIM查看子模块中的更改情况&#xff0c;确认哪些文件需要添加和提交。 git status添加子模块中的文件…

hash表和B树

Hash 表的优缺点 优点&#xff1a; 快速查找&#xff1a;Hash 表可以提供快速的插入操作和查找操作。不论哈希表中有多少数据&#xff0c;插入和删除&#xff08;有时包括查找&#xff09;只需要接近常量的时间即 O(1) 的时间级。代码简单&#xff1a;实现哈希表的代码相对简…

python代码制作数据集的测试和数据质量检测思路

前言 本文指的数据集为通用数据集&#xff0c;并不单是给机器学习领域使用。包含科研和工业领域需要自己制作数据集的。 首先&#xff0c;在制作大型数据集时&#xff0c;代码错误和数据问题可能会非常复杂。 前期逻辑总是简单的&#xff0c;库库一顿写&#xff0c;等排查的时…

macOS 无法安装第三方app,启用任何来源的方法

升级新版本 MacOS 后&#xff0c;安装下载的软件时&#xff0c;不能在 ”安全性与隐私” 中找不到 ”任何来源” 选项。 1. 允许展示任何来源 点击 启动器 (Launchpad) – 其他 (Other) – 终端 (Terminal)&#xff1a; 打开终端后&#xff0c;输入以下代码回车&#xff1a; …

机器翻译基础与模型 之一: 基于RNN的模型

一、机器翻译发展历程 基于规则的-->基于实例的-->基于统计方法的-->基于神经网络的 传统统计机器翻译把词序列看作离散空间里的由多个特征函数描述的点&#xff0c;类似 于 n-gram 语言模型&#xff0c;这类模型对数据稀疏问题非常敏感。神经机器翻译把文字序列表示…

Linux-Apache静态资源

文章目录 静态资源权限设置 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月20日11点21分 静态资源 Apache配置静态资源 可以在网页上配置一个静态的FTP服务器&#xff0c;让用户…

Vue核心特性解析(内含实践项目:设置购物车)

Vue 3 作为前端开发领域的热门框架&#xff0c;为构建用户界面提供了高效且灵活的解决方案。在上一篇博客&#xff1a;深度解析Vue3中&#xff0c;我们了解到了响应式数据、v-on、v-if、v-for、v-bind等Vue相关属性&#xff0c;这篇我们继续探讨Vue的其他属性&#xff0c;为你揭…

机器翻译基础与模型 之三:基于自注意力的模型

基于RNN和CNN的翻译模型&#xff0c;在处理文字序列时有个问题&#xff1a;它们对序列中不同位置之间的依赖关系的建模并不直接。以CNN的为例&#xff0c;如果要对长距离依赖进行描述&#xff0c;需要多层卷积操作&#xff0c;而且不同层之间信息传递也可能有损失&#xff0c;这…