【问题标题】:Unity3D 2018 OnInspectorGUI getAssetPath not workingUnity3D 2018 OnInspectorGUI getAssetPath 不起作用
【发布时间】:2019-12-23 15:45:34
【问题描述】:

我最近将我的 Unity 从 5.6 升级到 Unity2018.4.6f1,在我的项目中,我有一个名为“ConstantCollection”的脚本,该脚本有一个编辑器脚本 (ConstantCollectionEditor),它有一个 OnInspectorGui 覆盖编辑器。 该方法仅包含以下 3 行:

ConstantCollection col = (ConstantCollection)target;
string assetPath = AssetDatabase.GetAssetPath(col).ToLower();
Debug.LogError(assetPath);

在创建预制件并将ConstantCollection 组件附加到它后,代码运行并打印出一个空字符串。 根据文档,只有在资产不存在的情况下才会返回空字符串或 null,但显然资产存在。 此外,在版本更新之前,此代码片段可以完美运行。 谁能解释一下这个问题?

我将补充一点,不是尝试以这种方式获取资产路径,而是尝试提取对象的 guid 并使用实用程序从 guid 获取路径,但由于某种原因,从资产返回的 guid 是“000000000000000 ”。

【问题讨论】:

  • 资产文件可能还不存在 (?)

标签: unity3d


【解决方案1】:

经过一天的摆弄各种事情后,我找到了问题的原因和解决方案。 首先原因—— 由于我升级到 Unity2018.4.6f1,添加了“预制视图”功能,似乎(我不知道)当使用“预制视图”打开预制件时,Unity 实际上为视图创建了预制件的实例并且确实不使用实际的预制件,因此在 OnInspectorGUI 方法中使用目标时,它实际上引用了预制件的一个实例,而不是预制件本身。 关于解决方案 - 在漫游了很多统一文档并意识到 Unity 将预制视图作为它自己的阶段之后,我设法使用以下实验库替代解决了这个问题: 这是原始实现:

ConstantCollection col = (ConstantCollection)target;
string assetPath = AssetDatabase.GetAssetPath(col).ToLower();
Debug.LogError(assetPath);

这是新的实现:

ConstantCollection col = (ConstantCollection)target;
string assetPath = (UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetPrefabStage(col.gameObject)).prefabAssetPath.ToLower();
Debug.LogError(assetPath);

此更改从预制阶段的实例中定位实际预制并获取对它的引用,然后您可以简单地获取它的资产路径。 希望这可以为将来的人们节省一些时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多