この記事でのバージョン
Unity 2018.4.6f1
はじめに
以前「移動する可能性のある任意のアセットやディレクトリ(フォルダ)のパスを取得する方法」
という記事を投稿した際に
GUIDで管理する方法を教えてもらいました。
個人的にはGUIDで管理する形でやってるな~
— ツバメ (@TsubameUnity) 2019年12月16日
ScriptableObjectにファイル名とGUID突っ込んでおくのもよさそう。https://t.co/FNGspV5rrr pic.twitter.com/Vlemt3d5YD
GUID自体はよく耳にするのですが、実際に使ってみた事はなかったので、
今回は、GUIDを用いてアセットを管理してみようという感じの記事です!
GUIDとは
そもそもGUIDとはなんぞやという話からですが、
Globally Unique Identifierの略で、Unity以外でも広く使われている識別子の事です。
GUIDとは、128ビットの整数値からなる、データを一意に識別するために用いられる識別子のことである。
GUIDは、時刻やMACアドレスなどを含むデータとして生成され、重複があっては困る状況で利用される。Windowsではインターフェース識別子やクラス識別子などに利用されている。
GUIDは、絶対的に一意であることが保証されてるわけではないが、実用上はほぼ、世界中に唯一とみなして扱って困難がないといわれている。128ビットの値だと可読性に劣ることもあり、レジストリに記録する際には文字列で表現されている。
なお、GUIDは主にMicrosoftが利用している仕様で、同様の識別子が一般的にはUUID(Universally Unique Identifer)として扱われている。UUIDはRFC 4122で規定されている。
Unity上では全てのアセットにGUIDが設定されている上に、アセットを移動してもGUIDは変わりません。
ただし、GUIDは.metaファイルに記録されているので、
metaファイルを消したり、Finder上などでファイルのみを移動するとGUIDは変わってしまいます。
なお、プログラムからGUIDを取得する場合には以下のようにAssetDatabaseを使います。
using UnityEditor; //AssetDatabaseを使うのに必要
//Prefabをロード var prefab = Resources.Load("Prefab"); //Prefabのパスを取得 var path = AssetDatabase.GetAssetPath(prefab); //パスからGUIDを取得 var guid = AssetDatabase.AssetPathToGUID(path); //パスとGUIDをログで表示 Debug.Log($"path : {path}, GUID : {guid}");
GUIDを用いてアセットを管理する
実際にGUIDを用いてアセットを管理する際は、metaファイルやプログラムから取得したGUIDを
定数やScriptableObject等に保存し、そこからパス、そしてアセットを取得する感じになります。
using UnityEditor; //AssetDatabaseを使うのに必要
//PrefabのGUID private static readonly string PREFAB_GUID = "fcd2e291d13874c6ebff24f0fb8aa75e";
//GUIDからパスを取得 string path = AssetDatabase.GUIDToAssetPath(PREFAB_GUID); //パスからPrefabを取得 var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path); //パスとPrefabをログで表示 Debug.Log($"path : {path}, prefab : {prefab}");
もちろん、GUIDが変更されない(metaファイルが削除されない)前提になります。
ちなみにUnityPackageで配布する場合はmetaファイルも同梱されており、
違うプロジェクトにインポートされても各GUIDは変わらないため、GUIDでのアセット管理が有効です。