【问题标题】:Getting guid's from prefabs in Unity从 Unity 中的预制件中获取 guid
【发布时间】:2016-10-18 23:34:06
【问题描述】:

有点具体的问题,我正在编写一个脚本,该脚本将从项目中检索所有未使用的材料和纹理并显示/删除它们。我从场景文件中通过 GUID 解析路径,但遇到了几个问题,如果无法解决,则无法解决。

1) 在场景“.unity”文件中,当使用预制件时,它只包含此预制件的 GUID,但预制件本身包含子对象 - 如何访问它们? 例如:

Prefab:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Modification:
    m_TransformParent: {fileID: 0}
    m_Modifications:
    - target: {fileID: 444956, guid: 6a526c61069224c92930d52849053cbe, type: 2}
      propertyPath: m_LocalPosition.x
      value: 0
      objectReference: {fileID: 0}

在项目视图中也没有超过第二层级的子级:

我想要做的 - 以某种方式获取场景中“天花板”等所使用的所有材质和纹理。考虑到“蓝色”预制件是在运行时加载的,而不是在场景中,所以我只能从单一行为中获取根 guid。

2) 即使我以某种方式获得了所有使用的材质,如何在不访问游戏对象的渲染器的情况下正确获取它们使用的纹理,只是这些:

我知道这是一个有点混乱的问题,所以请询问是否有不清楚的地方。提前致谢。

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    你可能需要这个:AssetDatabase.GUIDToAssetPath(string guid);

    1. 您有父预制件 -> 您可以提取其所有子代的 guid -> 你可以找到孩子的预制件 -> 你可以提取他们孩子的所有guid等等......
    2. 你有一个材料->你可以提取所有guid它用过的材料 那么你可以使用AssetDatabase.GUIDToAssetPath(string guid) 来获取 所有使用的纹理路径。 Resources.Load<Texture2D>(string assetPath); 可用于获取实际纹理。
    3. 恐怕无法访问在运行时加载的预制件。只是 像着色器。如果您在运行时加载着色器并且忘记添加 给AlwaysIncludedShaders你会得到粉红色的东西 仅在构建版本上,但在编辑器中播放时不会。即使 Unity 也无法解决这个问题。至少现在还没有。

    更多您可能感兴趣的方法:
    EditorUtility.CollectDependencies();
    EditorUtility.CollectDeepHierarchy();

    【讨论】:

    • 至于 p1 - 我实际上看不到,在项目视图中看到“蓝色”游戏对象和预制件,它是一个带有一个 guid 的单个预制件,但我得出的结论是我想要的是这种方式是不可能的。但是非常感谢您提到的这些方法,这可能是对我来说另一种更好的做事方式! :)
    • 好的,CollectDependencies 是神一样的,可以确认它完成了我们需要的一切,选择分配给公共字段的预制件,它们的依赖项(垫子,纹理等),并且与以前的方式相比,速度超快完毕。谢谢你,伙计,你拯救了我的夜晚^_^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2016-11-04
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多