Unity在编辑器模式下一键替换组件/序列化的对象修改

本文介绍在Unity开发中,如何在编辑器模式下无损地替换已广泛使用的组件A为扩展后的组件B,涉及上百个Prefab的批量替换。通过修改序列化信息的m_Script字段,确保组件替换同时保留原有序列化状态。文章探讨了手动修改与代码自动化替换两种方法,强调了ApplyModifiedProperties和UpdateIfRequiredOrScript调用顺序的重要性。
摘要由CSDN通过智能技术生成

source:被替换的组件脚本,target:要替换的目标脚本。

前言

在游戏开发过程中,组件A已经大范围使用,后续因为需求原因导致我们需要对组件A进行拓展,并且不影响原来的功能的情况下,替换成扩展后的组件B,此时需要替换的范围是整个游戏内已经制作完成的prefab,上百个都是有可能的。

假设我们还使用了prefab的嵌套和变体的情况下,如果单纯的使用DestroyObjectImmediate和AddComponent,嵌套和变体就会引发新的问题。

本篇就是实现:丝滑替换组件并且保留原有的序列化信息

 

 

思路:通过修改序列化信息的m_Script来实现组件替换

方法一:手动修改

方法二:项目组一般替换会涉及全部替换,手动替换不现实,直接通过代码修改prefab的序列化信息达到替换的效果

source:被替换的组件脚本,target:要替换的目标脚本。

//assetPath:该prefab在Assets下的路径
GameObject root = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
          
//scriptPath:targe的脚本在Assets下的路径
var scriptPath = "Assets/Test/UITargete
ArgumentNullException: Value cannot be null. Parameter name: _unity_self UnityEditor.SerializedObject.FindProperty (System.String propertyPath) (at <505360e321ae48e3804e227a34262e1e>:0) UnityEditor.UIElements.Bindings.SerializedObjectBindingContext.BindPropertyRelative (UnityEngine.UIElements.IBindable field, UnityEditor.SerializedProperty parentProperty) (at <dfb6114cbc8f47d49a0a812a5562a1f9>:0) UnityEditor.UIElements.Bindings.SerializedObjectBindingContext.BindTree (UnityEngine.UIElements.VisualElement element, UnityEditor.SerializedProperty parentProperty) (at <dfb6114cbc8f47d49a0a812a5562a1f9>:0) UnityEditor.UIElements.Bindings.SerializedObjectBindingContext.ContinueBinding (UnityEngine.UIElements.VisualElement element, UnityEditor.SerializedProperty parentProperty) (at <dfb6114cbc8f47d49a0a812a5562a1f9>:0) UnityEditor.UIElements.Bindings.DefaultSerializedObjectBindingImplementation+BindingRequest.Bind (UnityEngine.UIElements.VisualElement element) (at <dfb6114cbc8f47d49a0a812a5562a1f9>:0) UnityEngine.UIElements.VisualTreeBindingsUpdater.Update () (at <d46c07da13f941aeb9b5f49c78214485>:0) UnityEngine.UIElements.VisualTreeUpdater.UpdateVisualTreePhase (UnityEngine.UIElements.VisualTreeUpdatePhase phase) (at <d46c07da13f941aeb9b5f49c78214485>:0) UnityEngine.UIElements.Panel.UpdateBindings () (at <d46c07da13f941aeb9b5f49c78214485>:0) UnityEngine.UIElements.UIElementsUtility.UnityEngine.UIElements.IUIElementsUtility.UpdateSchedulers () (at <d46c07da13f941aeb9b5f49c78214485>:0) UnityEngine.UIElements.UIEventRegistration.UpdateSchedulers () (at <d46c07da13f941aeb9b5f49c78214485>:0) UnityEditor.RetainedMode.UpdateSchedulers () (at <dfb6114cbc8f47d49a0a812a5562a1f9>:0)
07-15
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值