通过代码 (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 的实例覆盖的主要内容,如果未能解决你的问题,请参考以下文章

unity3d中c#如何修改物体局部的颜色

unity3d 怎样发布android程序

Unity3D:通过 C# 脚本从 FBX 中提取纹理

在 Unity3D 游戏中自定义 iOS 音量 HUD

unity3d c#热重载-边运行边改代码

Unity3D研究院之通过C#使用Advanced CSharp Messenger(五十)