##File IDとは?
UnityのアセットはGuidで管理されています。SceneやPrefab内(Hierarchy上)ではFile IDで管理されています。
--- !u!4 &1781688880
Transform:
m_GameObject: {fileID: 1781688879}
##2019.2以降でのFile IDの取得
GlobalObjectIdを使うと楽です。もちろんエディタ上でしか動作しません。
UnityEngine.Object targetObject = Selection.activeObject;
// GlobalObjectIdに変換
var id = GlobalObjectId.GetGlobalObjectIdSlow(targetObject);
// File ID
id.targetObjectId
// PrefabならInstance IDが入る Prefabで無ければ0
id.targetPrefabId
// GUID Prefabなら参照元(親)のGuidがIDが入る
id.assetGUID
// アセットの種別 0 = Null, 1 = Imported Asset, 2 = Scene Object, 3 = Source Asset
id.identifierType
シリアライズ、デシリアライズ
シリアライズ
ToString()
がオーバーライドされていてGlobalObjectId
を文字列にしてくれるので便利。Editor拡張に優しいですね。
下記のようなフォーマットで出力されます。
GlobalObjectId_V1-{identifierType}-{assetGUID}-{targetObjectId}-{targetPrefabId}
デフォルト
GlobalObjectId_V1-0-00000000000000000000000000000000-0-0
var id = GlobalObjectId.GetGlobalObjectIdSlow(targetObject);
var idString = id.ToString();
Debug.Log(idString);
// [Console] GlobalObjectId_V1-x-x-x-x
デシリアライズ
上記で言うidString
をTryParse
にそのまま突っ込むだけでOK。便利
if (GlobalObjectId.TryParse(idString, out GlobalObjectId result))
{
switch (result.identifierType)
{
// プロジェクト内のアセッは簡単
case 1:
var obj = GlobalObjectId.GlobalObjectIdentifierToObjectSlow(result);
Debug.Log(obj.name);
break;
// シーン上のアセットは取得が面倒だし重い
case 2 :
// 多分、シーンが開いていないと取得できません。
// 1. シーン上のすべてのgameObjectをGlobalObjectIdに変換
var sceneObjects = GameObject.FindObjectsOfType<GameObject>();
var sceneObjectIds = new GlobalObjectId[sceneObjects.Length];
GlobalObjectId.GetGlobalObjectIdsSlow(sceneObjects, sceneObjectIds);
// 2. 一致するものを探す
for (var i = 0; i < sceneObjectIds.Length; i++)
{
if (sceneObjectIds[i].Equals(result))
{
Debug.Log(sceneObjects[i].name);
break;
}
}
break;
}
}
##2019.2未満でのFile IDの取得
取得できるだけありがたいですが、触れてはいけない部分から取得してる気がして若干怖いです。
m_LocalIdentfierInFile
がスペルミスしてるので気をつけてください。
var inspectorModeInfo = typeof(SerializedObject).GetProperty("inspectorMode", BindingFlags.NonPublic | BindingFlags.Instance);
var serializedObject = new SerializedObject(Selection.activeObject);
inspectorModeInfo.SetValue(serializedObject, InspectorMode.Debug, null);
var localIdProp = serializedObject.FindProperty("m_LocalIdentfierInFile");
//File ID
Debug.Log(localIdProp.intValue);
参考
How to get the Local Identifier In File for scene objects - Unity Foru