如何通过C#代码在Unity3D中应用Prefab实例的修改覆盖?
Unity 2020.3+ 脚本实现Prefab实例修改全量应用
截至Unity 2020.3版本,官方未提供开箱即用的单步API实现等效编辑器内置「Apply Prefab」的功能,下述代码使用当前版本未废弃的正式API实现,自带参数校验和异常处理逻辑,一行即可调用:
// 传入场景中的Prefab实例GameObject即可完成全量修改应用 if (PrefabUtility.IsPartOfNonAssetPrefabInstance(targetInstance)) try { PrefabUtility.ApplyPrefabInstance(targetInstance, InteractionMode.UserAction); } catch (System.Exception e) { UnityEngine.Debug.LogError($"Prefab修改应用失败:{e.Message}", targetInstance); }
使用说明
- 入参
targetInstance为场景中需要应用修改的Prefab实例对象,不可直接传入Project窗口中的Prefab资产 - 前置校验会自动过滤非Prefab实例、Prefab资产等无效入参,避免报错
- 内置异常捕获可处理Prefab资产被锁定、无写入权限、实例结构损坏等特殊场景的问题
- 执行效果和编辑器右键点击Prefab实例选择「Apply All Modifications」完全一致,会自动记录撤销栈、触发资产保存流程
注意事项
- 该代码仅可在编辑器环境执行,需将脚本放在
Editor目录下,或用#if UNITY_EDITOR宏包裹代码逻辑 - 如需仅应用单个组件/属性的修改,可配合
PrefabUtility.ApplyObjectOverrideAPI实现 - 对嵌套Prefab的子节点调用时,默认仅应用到当前层级的Prefab资产,如需应用到最外层根Prefab,需先通过
PrefabUtility.GetOutermostPrefabInstanceRoot获取根实例后再调用
内容的提问来源于stack exchange,提问作者Konstantinos Vasileiadis
相关产品推荐
相关产品推荐

