Unityは特殊なフォルダ名でコンパイルされるソースの順番と出来上がるDLLファイルが違います。
まとめるとこんな感じです。
セクション | フォルダ名 | 書き出されるDLL名 |
---|---|---|
A | ・Standard Assets ・Pro Standard Assets ・Plugins 上記のフォルダ |
Assembly-CSharp-firstpass.dll |
B | ・Standard Assets ・Pro Standard Assets ・Plugins 上記内のEditorフォルダ |
Assembly-CSharp-Editor-firstpass.dll |
C | A, B, Editor以外のフォルダ | Assembly-CSharp.dll |
D | Editorフォルダ | Assembly-CSharp-Editor.dll |
※書き出されるDLLはプロジェクト内のLibrary/ScriptAssemblies
配下に作られます
ビルドされる順番はA, B, C, Dという順番で行われます。
そして、格納フォルダ名の違いによって作られるDLLが異なり、また先の表のA〜Dセクションのソースはそれぞれでコンパイル処理が走ります。
例えばCに含まれるソースを変更した場合、A, B, Dのビルドは走らず、Cのみ実行されます。
話は変わりますが、大規模開発をしていると、大抵Cのソースが増えていき、ちょっとした変更でも長めのコンパイル時間が発生するようになります。
しかし、このルールを利用してコンパイル時間を短縮することが出来ます。
早い話A〜Dにソースを分散させます。
1.Pluginsフォルダにソースを移す
Cのソースがコンパイル時間のボトルネックになることは仕方がないことです。ということで、できるだけCからAに移します。
※実質Pluginsフォルダへ移します。Standard Assets
, Pro Standard Assets
へのソース追加は管理上分かりづらいのでやめたほうが良いでしょう
しかしCから何でもかんでも移せるわけではありません。
先のコンパイル順番の規則から、CからAは参照できてもAからCは参照できません。
参照方向 | 可否 |
---|---|
A -> C | ☓ |
C -> A | ○ |
あくまでPluginsフォルダに入れることが出来るのはCに格納されるゲームロジックから独立したものにした方がソース管理的に無難です。
- ユーティル系クラス(計算系)
- データクラス
- ゲームロジックに依存しないライブラリ(トゥイーン系)
などが当てはまるのかなと思います。
可能であれば開発初期からソースをPluginsに分けて制作した方が良いです。間違えてゲームロジックにアクセスしていたなどのミスもコンパイルエラーという形で発見できます。
2.Editorスクリプトで出来ることはEditorに移す
Unityエディタでのテストコードがこれに当たることがあります。
例えば特定のアセットバンドルをダウンロードするテストは、Editorスクリプト側で処理を書くとか。
最後に
ソースのコンパイル順はリファレンスに詳しく載っています。私の経験上、開発を続けているとやはりコンパイル時間は我慢できないほど長くなっていきます。
何か手を打つにしても、開発後半では動きづらくなります。
開発の初期設計から分けられるソースを見極めていくほうが良い気がしています。
あわせてどうぞ