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#逻辑大致相似但需要单独提出逻辑

相关推荐
事圆则缓4 分钟前
Android 一次性事件怎么设计:Channel、SharedFlow 还是 UI State?
android·ui
我命由我123457 分钟前
Photoshop - Photoshop 使用魔棒工具选择单独的区域
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
特立独行的猫a13 分钟前
用仓颉语言给娃写了个打字练习游戏:cj-tauri 项目实战
游戏·ui·框架·tauri·仓颉·cangjie·cj-tauri
传奇开心果编程39 分钟前
【声明式UI开发实用技术学与练】第8课 状态提升与下放
学习·flutter·react native·ui·swiftui·composer
传奇开心果编程16 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程21 小时前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
传奇开心果编程21 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
Martina_032121 小时前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
golang学习记1 天前
VSCode AI完成任务的仪式感:撒礼花
ide·vscode·编辑器
小贺儿开发1 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页