完全とは言わないまでも、少し理解しないといけなくなったのでお勉強
雰囲気で書いているのであってないと思います。↑の記事を見ましょう
引用マークを書いているところは、基本的に上の記事からです。
Assembly Definition
Unity公式の機能で「C#のビルドファイル(アセンブリ)を分割して出力する」んだって
Assembly Definitionを適用したモジュール(フォルダ的な?)は、定義したフォルダごとにコンパイルされたり分割される。
Assembly-CSharp
何もしてなかったらC#スクリプトは「Assembly-CSharp」に全部納められる
Assembly-CSharpって聞いたことある・・・と思ったら、逆コンパイルを試したときに出てきたやつだ
Monoビルドしたときのフォルダの中に入っているんだよね
これが分割されるのか~
メリット
分割されると何がうれしいのか。
ソースコードに修正があった場合、該当するアセンブリのみがコンパイルされます。
そのため全体でコンパイル時間が短くなります。
他にもnamespaceがかぶっててもAssembly Definitionが違ったらセーフだったり、プラットフォーム毎にコードを分けてくれたりするって
所属確認
C#スクリプトがどこに所属しているかはInspectorで分かる
例えばuniVRMは定義してあるので、
VRMフォルダの中の適当なスクリプトを見たらVRMになってた。
定義する
Create>AssemblyDefinitionでasmfdefファイルというのが生成される
こんなのができる
このファイルがあるフォルダ以下のC#が一つのアセンブリのくくりになる
さっき作ったC#をこのフォルダに入れただけで所属が変わった!簡単!
依存関係
アセンブリ同士の依存関係を持つ場合…例えばコードから他のアセンブリに対してアクセスを行いたい場合、Referenceで対象のAssembly Definition Filesを選択すればOKです。
定義を分けたもの同士で依存関係を持つ場合はReferencesに設定しないといけない。
VRMだとこんな感じ。
VRMフォルダの下に入っているUniJSONフォルダなどは、また別にasmdfが作ってあり、それをVRMが参照している
asmdfで定義していない=Assembly-CSharp.dllに含まれるやつからは、他のアセンブリが何もしなくても参照できる
逆にAssembly Definition Filesで隔離されていないクラス…つまりAssemblyCSharpに入っているクラスは、Assembly Definition Filesで隔離したクラスに直接アクセス可能です。
でも逆に、定義した側から定義してない側は参照できない
Packagesフォルダ
Assets下じゃなくてPackages下に外部アセットがフォルダごと入ることもある。
その場合、Packages内のフォルダの中のスクリプトを参照するにはasmdfファイルがPackages内のフォルダにある必要があるっぽい
TextMeshの中身などを見たらちゃんとあった。
ーーー
もともとAssets下にあったuniVRMアセットをPackagesに移したら、シーン内で使っているVRM関連のスクリプトが「the associated script can not be loaded」ってなって使えなくなったの
原因はasmdfファイルがないことだった。
uniVRMにasmdefが同梱されたのはv0.56からなんだけど、v0.55を使ってた><
asmdef を本体の unitypackage へ同梱 · Issue #391 · vrm-c/UniVRM · GitHub
Packages以下はAssets以下とは別アセンブリなのかな~