通过代码 (C#) 在 Unity3D 中应用 Prefab 的实例覆盖
Posted
技术标签:
【中文标题】通过代码 (C#) 在 Unity3D 中应用 Prefab 的实例覆盖【英文标题】:Applying a Prefab's Instance's overrides in Unity3D through code (C#) 【发布时间】:2022-01-02 17:07:27 【问题描述】:截至 v2020.3,Unity 仍未为我们提供干净的 API,用于通过脚本应用单个预制件的覆盖。
本质上是一个干净的单线,真正反映“应用预制件”的概念,包括异常处理。
这是过时的,因为它使用了不推荐使用的功能 https://forum.unity.com/threads/apply-changes-to-prefab-keyboard-shortcut.29251/#post-2538088
【问题讨论】:
【参考方案1】:与此斗争了一段时间,当前的脚本如下。希望它可以作为构建适合您的自定义工作流程的基础。
using UnityEditor;
using UnityEngine;
public static class Editor_Helper
[MenuItem("Editor/Apply Selected Prefab &[")]
public static void ApplySelectedPrefab()
GameObject gO = GetCurrentlySelectedObjectHierarchy();
if (gO == null)
Debug.LogWarning("Selection is not a GameObject");
return;
GameObject rootGO = PrefabUtility.GetOutermostPrefabInstanceRoot(gO);
if (rootGO == null)
Debug.LogWarning(string.Format("Selected GameObject (0) is not part of a prefab", gO), gO);
return;
PrefabInstanceStatus prefabInstanceStatus = PrefabUtility.GetPrefabInstanceStatus(rootGO);
if (prefabInstanceStatus != PrefabInstanceStatus.Connected)
Debug.LogWarning(string.Format("Selected Prefab Root of 0 (1) has invalid status of 2", gO, rootGO, prefabInstanceStatus), rootGO);
return;
if (!PrefabUtility.HasPrefabInstanceAnyOverrides(rootGO, false))
Debug.LogWarning(string.Format("Selected Prefab Root of 0 (1) doesn't have any overrides", gO, rootGO), rootGO);
return;
PrefabUtility.ApplyPrefabInstance(rootGO, InteractionMode.UserAction);
AssetDatabase.SaveAssets();
Debug.Log(string.Format("Changes on 0 applied to 1", gO, rootGO), rootGO);
private static GameObject GetCurrentlySelectedObjectHierarchy() => Selection.activeGameObject;
【讨论】:
以上是关于通过代码 (C#) 在 Unity3D 中应用 Prefab 的实例覆盖的主要内容,如果未能解决你的问题,请参考以下文章