渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

フォルダ名によるコンパイル順とコンパイル時間の短縮化


f:id:esakun:20150730215258g:plain

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スクリプト側で処理を書くとか。

最後に

ソースのコンパイル順はリファレンスに詳しく載っています。私の経験上、開発を続けているとやはりコンパイル時間は我慢できないほど長くなっていきます。
何か手を打つにしても、開発後半では動きづらくなります。
開発の初期設計から分けられるソースを見極めていくほうが良い気がしています。

あわせてどうぞ

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info