Unity编辑器

新博客:https://yinl.fun
欢迎关注,同步更新

Unity编辑器

这篇文章主要总结一下最近工作时写的一些编辑器,总结了三种常用的编辑器编写方式:

Inspector Editor

利用CustomEditor特性挂接Script来实现Inspector界面显示

InspectorEditorImage

首先我们给出对应的Script代码,主要是为了提供Inspector面板的参数而用

public class SampleEditorScript : MonoBehaviour
{
    public int sliderNum = 0;
    public int intNum = 0;
    public float floatNum = 0f;
    public string str = "";
    public Vector2 pos = Vector2.zero;
}

之后写对应的Editor文件

// 脚本为前面编写的数据脚本
[CustomEditor(typeof(SampleEditorScript))]
// [CanEditMultipleObjects] 多对象编辑
public class SampleEditor : Editor
{
    SerializedProperty sliderNum;
    SerializedProperty intNum;
    SerializedProperty floatNum;
    SerializedProperty str;
    SerializedProperty pos;

    void OnEnable()
    {
        // 将值传给对应的SerializedProperty
        sliderNum = serializedObject.FindProperty("sliderNum");
        intNum = serializedObject.FindProperty("intNum");
        floatNum = serializedObject.FindProperty("floatNum");
        str = serializedObject.FindProperty("str");
        pos = serializedObject.FindProperty("pos");
    }

    /// <summary>
    /// 绘制Inspector窗口
    /// </summary>
    public override void OnInspectorGUI()
    {
        // 每次绘制insperctor面板的时候都应该更新一下serializedObjectd的数据
        serializedObject.Update();

        // 除PropertyField函数外,正常函数也封装了传入SerializedProperty的用法
        EditorGUILayout.IntSlider(sliderNum, 0, 100, new GUIContent("Slider"));
        ProgressBar(sliderNum.intValue / 100.0f, "Slider Num");

        // PropertyField好处为自动识别类型
        EditorGUILayout.PropertyField(intNum, new GUIContent("Int Num"));
        EditorGUILayout.PropertyField(floatNum, new GUIContent("Float Num"));
        EditorGUILayout.PropertyField(str, new GUIContent("string"));
        EditorGUILayout.PropertyField(pos, new GUIContent("Vector2"));

        // 将数据更改应用于serializedObject
        serializedObject.ApplyModifiedProperties();
    }

    /// <summary>
    /// 绘制Scene窗口
    /// </summary>
    void OnSceneGUI()
    {
        // 绘制的线为红色
        Handles.color = Color.red;
        // 在点(0,0,0)到(1,1,1)画一条红线
        Handles.DrawLine(Vector3.zero, Vector3.one);
    }

    /// <summary>
    /// 自定义进度条
    /// </summary>
    /// <param name="value">进度条值</param>
    /// <param name="label">进度条名字</param>
    void ProgressBar(float value, string label)
    {
        // 为文本框绘制一个进度条
        Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField");
        EditorGUI.ProgressBar(rect, value, label);
        EditorGUILayout.Space();
    }
}

EditorWindow

创建一个编辑器视窗,视窗可以内嵌到Unity编辑器中

EditorWindowImage

public class SampleEditorWindow : EditorWindow
{
    private int intNum = 0;
    private float floatNum = 0f;
    private string str = "";
    private Vector2 SVPos;

    /// <summary>
    /// 菜单栏响应函数
    /// </summary>
    [MenuItem("EditorTools/SampleEditorWindow")]
    static void Init()
    {
        // 初始化窗口并显示
        SampleEditorWindow window = (SampleEditorWindow)GetWindow(typeof(SampleEditorWindow));
        window.Show();
    }

    /// <summary>
    /// 界面绘制函数
    /// </summary>
      void OnGUI()
      {
        // 绘制可用EditorGUILayout、GUILayout所提供的函数等

        // 竖直排版
        EditorGUILayout.BeginHorizontal();
        // 滑动组件
        SVPos = EditorGUILayout.BeginScrollView(SVPos);
        // int输入框
        intNum = EditorGUILayout.IntField("Int Num", intNum);
        // float输入框
        floatNum = EditorGUILayout.FloatField("Float Num", floatNum);
        // string输入框
        str = EditorGUILayout.TextField("string", str);
        // 等等...
        EditorGUILayout.EndScrollView();
        EditorGUILayout.EndHorizontal();
    }
}

ScriptableWizard

创建一个编辑器导航视窗

ScriptableWizardImage

public class SampleScriptableWizard : ScriptableWizard
{
    public int intNum = 0;
    public float floatNum = 0f;
    public string str = "";

    [MenuItem("EditorTools/SampleScriptableWizard")]
    static void Init()
    {
        ScriptableWizard.DisplayWizard<SampleScriptableWizard>("Wizard界面", "Wizard按钮", "Wizard另一个按钮");
    }

    /// <summary>
    /// 界面的刷新
    /// </summary>
    void OnWizardUpdate()
    {
        helpString = "这是一条提示语句";
    }

      /// <summary>
      /// 按钮执行功能
      /// </summary>
    void OnWizardCreate()
    {
        Debug.Log("点击按钮");
    }

    void OnWizardOtherButton()
    {
        Debug.Log("点击另一个按钮");
    }
}

转载于:https://www.cnblogs.com/SHOR/p/9465178.html

### Unity 编辑器使用指南与下载 在Unity中,编辑器扩展开发是提升生产力和自定义工作流的重要手段。以下内容将详细介绍如何使用Unity编辑器进行开发,以及相关资源的获取方式。 #### 1. 编辑器脚本的基础知识 所有编辑器扩展脚本必须放置在 `Assets/Editor` 文件夹(或其子目录)中,否则无法被Unity识别[^1]。此外,编辑器脚本需要引入 `UnityEditor` 命名空间以访问编辑器相关的API: ```csharp using UnityEditor; ``` Unity脚本分为两种模式:编辑时(Editor)和运行时(Runtime)。编辑时脚本仅在Unity编辑器中运行,不会出现在最终的游戏构建中[^2]。这种特性使得开发者可以专注于为编辑器添加功能,而无需担心对游戏性能的影响。 #### 2. 自定义工具栏扩展 通过 `unity-toolbar-extender` 插件,开发者可以轻松扩展Unity工具栏,向其中添加自定义UI代码[^3]。例如,可以通过该插件实现快捷按钮、菜单项等功能。项目地址为:[https://gitcode.com/gh_mirrors/un/unity-toolbar-extender](https://gitcode.com/gh_mirrors/un/unity-toolbar-extender)。 #### 3. 自定义Inspector界面 若要为特定的MonoBehavior类创建自定义Inspector界面,需继承 `UnityEditor.Editor` 类,并在类上添加 `[CustomEditor(typeof(目标MonoBehavior类))]` 属性[^4]。之后,重写 `OnInspectorGUI` 方法即可实现自定义逻辑。示例如下: ```csharp using UnityEditor; using UnityEngine; [CustomEditor(typeof(MyCustomComponent))] public class MyCustomComponentEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); MyCustomComponent myTarget = (MyCustomComponent)target; if (GUILayout.Button("Perform Action")) { myTarget.PerformAction(); } } } ``` 上述代码为 `MyCustomComponent` 添加了一个按钮,点击后调用其 `PerformAction` 方法。 #### 4. Unity编辑器的下载 Unity编辑器可通过官方网站下载:[https://unity.com/](https://unity.com/)。选择适合操作系统的版本,并根据需求安装个人版或专业版。安装过程中可以选择包含模块,如2D支持、AR/VR工具包等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值