(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

GUIDを用いてアセットを管理する【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加



この記事でのバージョン
Unity 2018.4.6f1


はじめに

以前「移動する可能性のある任意のアセットやディレクトリ(フォルダ)のパスを取得する方法

という記事を投稿した際に



GUIDで管理する方法を教えてもらいました。



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は変わってしまいます。

f:id:kan_kikuchi:20191226043810j:plain


なお、プログラムから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}");
f:id:kan_kikuchi:20191226043818j:plain



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}");
f:id:kan_kikuchi:20191226051655j:plain


もちろん、GUIDが変更されない(metaファイルが削除されない)前提になります。


ちなみにUnityPackageで配布する場合はmetaファイルも同梱されており、

違うプロジェクトにインポートされても各GUIDは変わらないため、GUIDでのアセット管理が有効です。