へくれすブログ

UnityとC#中心の備忘録です

【Unity】コードから最新のYAMLクラスIDリファレンスを取得する方法

今回はYAMLクラスIDリファレンスを取得する方法についてです。
Unityの公式ドキュメントの情報が古いためリフレクションで強引に取得します。

f:id:hecres:20180317152302j:plain

YAMLクラスIDとは

YAML(ヤメル、ヤムル)はデータ形式の一種です。XMLやJSONなどの同類です。

そしてクラスIDとは、その名の通り各クラスに割り当てられたIDのことです。
GameObject=1、Component=2…といったように、Unity内の各クラスにはIDが割り振られています*1

どのクラスにどのIDが割り振られているかは、基本的にはUnity公式ドキュメントで公開されています。

currentドキュメント
YAML クラス ID リファレンス - Unity マニュアル

ちなみにversion 5.4以降のドキュメントはレイアウトが妙に見づらいので、
雰囲気を掴むには5.3のドキュメントのほうがお勧めです。

5.3ドキュメント
Unity - マニュアル: YAML クラス ID リファレンス

クラスIDが必要となる場面

PlayerSettings内のStrip Engine Codeをtrueにしている場合、クラスIDは非常に重要な情報です。

Strip Engine Codeとは、ビルド時にUnityエンジン側のコードを必要最低限のみ含める機能です。
使用されていないコードを除外することでビルドサイズの削減が見込め、特にWebGLでは影響が顕著に現れます。

しかし落とし穴もあり、この「必要最低限」にはAssetBundleが考慮されません。

あるコンポーネントが
「AssetBundle内で使用されている、かつ、アプリ本体側に含まれていない」場合
そのコンポーネントはビルドに含まれないため実行段階でエラーとなります。

エラーメッセージは「Could not produce class with ID 331」のような形式です。

この場合331=SpriteMaskがないぞと怒られているため、SpriteMaskをスプリット対象外に設定すれば解決できます。

指定クラスをスプリット対象外とするにはAssets直下にlink.xmlという名前のXMLファイルを作成します。

問題は冒頭で述べた通りUnity公式ドキュメントの情報が古く、
エラーメッセージで出たクラスIDが必ずしも載っているとは限らない点です。

SpriteMaskも本記事を書いている時点での最新版(2018.1ドキュメント)では記載されていません。

コードから最新のクラスIDを取得する方法

本題です。

クラスIDはUnityEditor.UnityTypesクラスが持っています。
UnityTypesクラスはinternal sealed定義となっているためリフレクションでアクセスします。

上記GetClassNameメソッドで指定したIDのクラス名が取得できます。

特定のIDを取得するのではなく、すべてをリストアップしたい場合は
上記メソッドをfor文で1200回ほど回してください。

Unity公式ドキュメントに記載されているIDは1120までなので
それだけ回せば全IDを取得できるはずです。

参考/関連

docs.unity3d.com
https://forum.unity.com/threads/yaml-class-id-reference.501959/

この記事でのバージョン

Version
Unity 2017.3.0p4
Unity/PlayerSettings/Scripting Runtime Version Experimental (.NET 4.6 Equivalent)

*1:なお、スクリプトで定義されたクラスはすべてMonoBehaviour=114のクラスIDが割り振られます。