トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

UnityのAssembly Definitionのお勉強~

完全とは言わないまでも、少し理解しないといけなくなったのでお勉強

qiita.com

雰囲気で書いているのであってないと思います。↑の記事を見ましょう

引用マークを書いているところは、基本的に上の記事からです。

Assembly Definition

Unity公式の機能で「C#のビルドファイル(アセンブリ)を分割して出力する」んだって

docs.unity3d.com

Assembly Definitionを適用したモジュール(フォルダ的な?)は、定義したフォルダごとにコンパイルされたり分割される。

Assembly-CSharp

何もしてなかったらC#スクリプトは「Assembly-CSharp」に全部納められる

 

Assembly-CSharpって聞いたことある・・・と思ったら、逆コンパイルを試したときに出てきたやつだ

bibinbaleo.hatenablog.com

Monoビルドしたときのフォルダの中に入っているんだよね

f:id:bibinbaleo:20201225110258p:plain

これが分割されるのか~

メリット

分割されると何がうれしいのか。

ソースコードに修正があった場合、該当するアセンブリのみがコンパイルされます。
そのため全体でコンパイル時間が短くなります。

他にもnamespaceがかぶっててもAssembly Definitionが違ったらセーフだったり、プラットフォーム毎にコードを分けてくれたりするって

tsubakit1.hateblo.jp

所属確認

C#スクリプトがどこに所属しているかはInspectorで分かる

f:id:bibinbaleo:20201225111526p:plain



例えばuniVRMは定義してあるので、

f:id:bibinbaleo:20201225111421p:plain

VRMフォルダの中の適当なスクリプトを見たらVRMになってた。

f:id:bibinbaleo:20201225111737p:plain

定義する

Create>AssemblyDefinitionでasmfdefファイルというのが生成される

f:id:bibinbaleo:20201225105620p:plain

こんなのができる

f:id:bibinbaleo:20201225112021p:plain

このファイルがあるフォルダ以下のC#が一つのアセンブリのくくりになる

f:id:bibinbaleo:20201225112132p:plain

さっき作ったC#をこのフォルダに入れただけで所属が変わった!簡単!

f:id:bibinbaleo:20201225112018p:plain

依存関係

アセンブリ同士の依存関係を持つ場合…例えばコードから他のアセンブリに対してアクセスを行いたい場合、Referenceで対象のAssembly Definition Filesを選択すればOKです。

【Unity】Assembly Definition Filesという神機能 - テラシュールブログ

定義を分けたもの同士で依存関係を持つ場合はReferencesに設定しないといけない。

 VRMだとこんな感じ。

f:id:bibinbaleo:20201225114402p:plain

VRMフォルダの下に入っているUniJSONフォルダなどは、また別にasmdfが作ってあり、それをVRMが参照している

 

 

asmdfで定義していない=Assembly-CSharp.dllに含まれるやつからは、他のアセンブリが何もしなくても参照できる

逆にAssembly Definition Filesで隔離されていないクラス…つまりAssemblyCSharpに入っているクラスは、Assembly Definition Filesで隔離したクラスに直接アクセス可能です。

【Unity】Assembly Definition Filesという神機能 - テラシュールブログ

でも逆に、定義した側から定義してない側は参照できない 

f:id:bibinbaleo:20201225114627p:plain

Packagesフォルダ

Assets下じゃなくてPackages下に外部アセットがフォルダごと入ることもある。

f:id:bibinbaleo:20201225115345p:plain

 その場合、Packages内のフォルダの中のスクリプトを参照するにはasmdfファイルがPackages内のフォルダにある必要があるっぽい

TextMeshの中身などを見たらちゃんとあった。

f:id:bibinbaleo:20201225115609p:plain

ーーー

もともとAssets下にあったuniVRMアセットをPackagesに移したら、シーン内で使っているVRM関連のスクリプトが「the associated script can not be loaded」ってなって使えなくなったの

f:id:bibinbaleo:20201225120206p:plain

原因はasmdfファイルがないことだった。

uniVRMにasmdefが同梱されたのはv0.56からなんだけど、v0.55を使ってた><

asmdef を本体の unitypackage へ同梱 · Issue #391 · vrm-c/UniVRM · GitHub

 

Packages以下はAssets以下とは別アセンブリなのかな~