渋谷ほととぎす通信

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

Unity2017.3のAssembly Definitionがコンパイル時間短縮の救世主になりそうな予感


f:id:esakun:20150730215258g:plain

Unity2017.2までは、各ソースはディレクリ命名ルールから以下の4種類のAssemblyファイルが生成されていました。

  • Assembly-CSharp-firstpass.dll
  • Assembly-CSharp-Editor-firstpass.dll
  • Assembly-CSharp.dll
  • Assembly-CSharp-Editor.dll

詳しくはコチラをどうぞ。
Unityのコンパイル時間短縮化の工夫 - 渋谷ほととぎす通信

先の記事でも書きましたが、Assembly-CSharp.dllが大抵肥大化することとなり、コンパイル時間を大きく増やす原因になります。

私が経験してきたプロジェクトの中で最長コンパイル時間は40秒〜1分ほどです。

1行コードを書いただけでこれだけ時間かかると結構ストレスです。
※こちらの時間はパソコンのスペックを上げてもあまり変化がありません。

少しでもコンパイル時間を早くするには、Pluginsフォルダへ移動させたり、そもそもソースコードを減らしたり工夫する必要があります。

そんな苦労が多少軽減されるであろう機能がUnity2017.3実装予定のAssembly Definitionです。

開発者指定ディレクトリレベルでAssemblyを分割できるようになります!

例えば、以下のような独立したモジュール単位でアセンブリを作ることが可能です。(更に細分化も可能)

  • タイトル
  • メニュー
  • バトル
  • リザルト

こうすることで例えばタイトルのソースコードを変更した場合はタイトルのコードだけがコンパイルされますので、コンパイル時間は今までに比べると早くなる可能性が高いでしょう。

また、共通で使用するCommon的なモジュールが存在する場合も、Commonで区切ってアセンブリ化し、それを参照として各モジュールに渡すことも可能です。

Commonが肥大化する可能性もありますが、今まで全ソースコンパイルしていたことを考えると大きな改善だと思われます。

アセットストアからダウンロードしたコードたちを1つのアセンブリにしても良いかもしれません。アセットの更新が掛かるときだけコンパイルされるので、大規模なアセット、多くのアセットを使用している際は効果が大きそうです。

f:id:esakun:20171108095419p:plain

このようにCreate > Assembly DefinitionでAssemblyDefinitionファイルを作成します。

f:id:esakun:20171108095509p:plain

先の説明に合ったCommon的な共通で使用したいモジュールは、そのアセンブリをReferencesに渡すだけです。

最後に

Assemblu Definitionは、結構前から欲しかった機能でした。大規模プロジェクトになるとどうしてもコンパイル時間がキーで開発効率が下がっていましたので、それを打破する一手になるんじゃないかなって思います。

Unity2017.3が待ち遠しいです。

余談

循環参照すると以下のエラーが出力されるので注意。

Assembly with cyclic references detected 

環境

  • Unity2017.3.0b8