从 Unity 中的预制件获取 guid

Getting guid's from prefabs in Unity

有点具体的问题,我正在编写一个脚本,该脚本将从项目中检索所有未使用的材料和纹理,并 show/delete 它们。我从场景文件中通过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}

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

我想做的 - 以某种方式获取场景中 "Ceiling" 使用的所有材质和纹理。考虑到 "Blue" 预制件是在运行时加载的,不存在于场景中,所以我只能从 monobehaviour 中获取根 guid。

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

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

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

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

还有一些您可能感兴趣的方法:
EditorUtility.CollectDependencies();
EditorUtility.CollectDeepHierarchy();