如何在运行时使用Unity版本2018.3查找GameObjects Prefab

时间:2019-01-01 02:23:25

标签: c# unity3d

更新到Unity 2018.3.0f2后,我无法在游戏运行时找到GameObjects预制件。在以前的版本中,我只是使用以下行:

GameObject prefabObject = 
    PrefabUtility.GetCorrespondingObjectFromSource(gameObject);

但是在更新之后,此函数仅返回null,因此我尝试了新函数:

  1. PrefabUtility.GetPrefabInstanceHandle
  2. PrefabUtility.GetNearestPrefabInstanceRoot
  3. PrefabUtility.GetOutermostPrefabInstanceRoot

但是它们全部返回null,但是我确定我会将预制件作为参数移交。有什么想法我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

一旦编辑器开始播放(Application.isPlaying = true),与场景游戏对象的预制链接将中断(蓝色游戏对象变为灰色),因此您无法从中获取与预制相关的信息。

如果您确实需要在运行时访问此类信息的情况,则应将其另存为脚本组件中的序列化变量,以便以后在运行时可用。

例如:这是Mirror(Unity网络插件)正在做的简化工作,它通过发布资产ID相关的东西来帮助区分每个预制件,以在运行时在网络中生成事物。

    [SerializeField] string m_AssetId;

    void OnValidate() // Which will be called on build or editor play
    {
    #if UNITY_EDITOR
         // Deposit UnityEditor API dependent into some field
         m_AssetId = UnityEditor.AssetDatabase.GetAssetPath( gameObject );
    #endif
    }

无论如何,如果您要测试或寻找原始预制件,请运行编辑器脚本 UnityEditor.PrefabUtility 很难找到使用它们的完整示例。

有关示例如何使用它们的信息,请参阅我的git存储库。

https://github.com/wappenull/UnityPrefabTester

enter image description here