AssetDatabase.TryGetGUIDAndLocalFileIdentifier

切换到手册
public static bool TryGetGUIDAndLocalFileIdentifier (Object obj, out string guid, out int localId);
public static bool TryGetGUIDAndLocalFileIdentifier (int instanceID, out string guid, out int localId);

参数

instanceID要检索其信息的对象的实例 ID。
obj要检索其 GUID 和文件 ID 的对象。
guid资源的 GUID。
localId该资源的本地文件标识符。

返回

bool 如果成功找到 GUID 和文件 ID,则返回 true;否则,返回 false。

描述

从对象实例 ID 中获取 GUID 和本地文件 ID。

当 Unity 序列化资源引用时,此函数会指向 GUID 和文件 ID。GUID 是唯一哈希值,文件 ID 是相对于资源的值。当序列化资源引用另一资源时,会使用这两个值。

如果使用文本序列化项目(请参阅 Editor Settings),可能需要手动修改此信息。常见用途是,将 C# 脚本文件从项目移动到 DLL 的同时,使使用这些脚本的任何游戏对象保持完整。举例来说,假设您的项目包含一个 C# MonoBehaviour、一个场景以及一个附加该脚本的游戏对象。序列化时,Unity 场景文件将包含与下述相似的内容(简化为相关部分):

/* example .unity scene contents:

--- !u!1 &65078845 GameObject: m_Component: -component: {fileID : 65078850} --- !u!114 &65078850 MonoBehaviour: m_Script: {fileID : 11500000, guid : 9cbd8cdf99d44b58972fbc7f6f38088f, type : 3}

*/

m_Script 字段当前指向 MyScript.cs GUID 和文件 ID。

现在,假设您要将 MyScript.cs 编译到 DLL,并从项目中删除 MyScript(因为它已在 DLL 中编译)。删除 MyScript.cs 将中断任何 MonoBehaviour 引用,即使它仍以 DLL 形式存在。这是因为 MyScript 行为的 GUID 和 FileID 不再相同。要修复此状态,请将 TryGetGUIDAndLocalFileIdentifier 与 DLL 一起使用以检索新的资源 ID,然后找到并替换 m_Script 对旧的 MyScript.cs 的引用。

using System.Text;
using System.Collections;
using UnityEngine;
using UnityEditor;

class ShowAssetIds { [MenuItem("Assets/Show Asset Ids")] static void MenuShowIds() { var stringBuilder = new StringBuilder();

foreach (var obj in AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(Selection.activeObject))) { string guid; int file;

if (AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj, out guid, out file)) { stringBuilder.AppendFormat("Asset: " + obj.name + "\n Instance ID: " + obj.GetInstanceID() + "\n GUID: " + guid + "\n File ID: " + file); } }

Debug.Log(stringBuilder.ToString()); } }