Unity编辑器扩展:UI绑定复制工具

在UI开发中,当我们需要为相似预制体快速复制字段绑定时,手动操作既繁琐又容易出错。本文将介绍一个高效解决这一痛点的Unity编辑器扩展工具。(适用于换皮活动)

这是一个UI环比开发的绑定复制工具,主要功能是将公共字段和[SerializeField]标记的引用字段从一个MonoBehaviour组件复制到另一个组件。它特别适用于以下场景:

  1. 替换UI界面风格时复用绑定逻辑
  2. 在相似组件之间快速转移引用
  3. 避免重复拖拽引用字段的操作

使用方式

  1. 通过 Tools > UI Binding Copier 打开窗口
  2. 拖拽源组件(已配置好绑定的组件)
  3. 拖拽目标组件(需要接收绑定的组件)
  4. 点击 Copy Bindings 按钮完成复制
csharp 复制代码
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;

public class BindingCopier : EditorWindow
{
    private MonoBehaviour sourceComponent;
    private MonoBehaviour targetComponent;

    [MenuItem("Tools/UI Binding Copier")]
    public static void ShowWindow()
    {
        GetWindow<BindingCopier>("Binding Copier");
    }

    void OnGUI()
    {
        GUILayout.Label("Copy UI Bindings Between Components", EditorStyles.boldLabel);

        sourceComponent = (MonoBehaviour)EditorGUILayout.ObjectField(
            "Source Component",
            sourceComponent,
            typeof(MonoBehaviour),
            true);

        targetComponent = (MonoBehaviour)EditorGUILayout.ObjectField(
            "Target Component",
            targetComponent,
            typeof(MonoBehaviour),
            true);

        if (GUILayout.Button("Copy Bindings"))
        {
            if (sourceComponent != null && targetComponent != null)
            {
                CopyBindings(sourceComponent, targetComponent);
                EditorUtility.DisplayDialog("Success", "Bindings copied successfully!", "OK");
            }
            else
            {
                EditorUtility.DisplayDialog("Error", "Please assign both source and target components", "OK");
            }
        }

        EditorGUILayout.HelpBox(
            "这个工具可以把公共字段和[SerializeField]引用从一个组件复制到另一个组件" +
            "当组件具有相似的字段名称和类型时,效果最佳(C#换皮用)",
            MessageType.Info);
    }

    public static void CopyBindings(MonoBehaviour source, MonoBehaviour target)
    {
        if (source == null || target == null) return;

        SerializedObject sourceSerialized = new SerializedObject(source);
        SerializedObject targetSerialized = new SerializedObject(target);

        SerializedProperty iterator = sourceSerialized.GetIterator();
        bool enterChildren = true;

        while (iterator.NextVisible(enterChildren))
        {
            enterChildren = false;

            if (iterator.propertyType == SerializedPropertyType.ObjectReference)
            {
                string propertyName = iterator.name;
                SerializedProperty targetProperty = targetSerialized.FindProperty(propertyName);

                if (targetProperty != null &&
                    targetProperty.propertyType == SerializedPropertyType.ObjectReference &&
                    targetProperty.objectReferenceValue == null) // Optional: only overwrite null values
                {
                    targetSerialized.CopyFromSerializedProperty(iterator);
                }
            }
        }

        targetSerialized.ApplyModifiedProperties();
        EditorUtility.SetDirty(target);
    }
}
#endif

效果如下所示

只需要将预制体上的组件拖动过去 就能快速的复用绑定关系

适用场景:适用于换皮活动C#逻辑大致相似但需要单独提出逻辑

相关推荐
冰茶_10 天前
ASP.NET Core API文档与测试实战指南
后端·学习·http·ui·c#·asp.net
Zevalin爱灰灰10 天前
MATLAB GUI界面设计 第三章——仪器组件
开发语言·ui·matlab
ui设计前端开发老司机10 天前
数字孪生:为UI前端设计带来沉浸式交互新体验
ui
专注VB编程开发20年10 天前
java/.net跨平台UI浏览器SDK,浏览器控件开发包分析
linux·ui·跨平台·浏览器·cef·miniblink
F_D_Z10 天前
【vim】通过vim编辑器打开、修改、退出配置文件
linux·编辑器·vim
:-)10 天前
VSCode新窗口背景水印logo修改美化
ide·vscode·编辑器
bao_lanlan10 天前
UI设计 | 审美积累 | 极繁风格(Maximalism / Complex UI)
ui·ux·高端网站设计·qt软件开发·高端ui设计公司·用户体验设计公司
10 天前
Lua复习之何为闭包
开发语言·unity·游戏引擎·lua·交互
深空数字孪生10 天前
2025年小程序地图打车的5大技术革新:实时路况预测与智能调度升级
大数据·人工智能·unity·性能优化·小程序·游戏引擎