在UI开发中,当我们需要为相似预制体快速复制字段绑定时,手动操作既繁琐又容易出错。本文将介绍一个高效解决这一痛点的Unity编辑器扩展工具。(适用于换皮活动)
这是一个UI环比开发的绑定复制工具,主要功能是将公共字段和[SerializeField]标记的引用字段从一个MonoBehaviour组件复制到另一个组件。它特别适用于以下场景:
- 替换UI界面风格时复用绑定逻辑
- 在相似组件之间快速转移引用
- 避免重复拖拽引用字段的操作
使用方式
- 通过 Tools > UI Binding Copier 打开窗口
- 拖拽源组件(已配置好绑定的组件)
- 拖拽目标组件(需要接收绑定的组件)
- 点击 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#逻辑大致相似但需要单独提出逻辑