ちょび日記

明日は明日の風が吹く

2016-08-25

UnityのPlayボタンを押しても時間がかかる問題


Unityで作成しているプロジェクトも大きくなってくるとPlayボタンを押しても 初回の再生まで10数秒~数十秒単位でかかってくる事があります。なぜこのような状況になるか調べてみました。

コンパイルの流れ

特殊フォルダーとスクリプトコンパイル順に記載の通り

  • Standard Assets、Pro Standard Assets、Plugins フォルダーに入ったランタイムスクリプト。
  • Standard Assets、Pro Standard Assets、Plugins フォルダーにある Editor フォルダーのエディタースクリプト
  • Editor フォルダーに入ったもの以外の、その他すべてのスクリプト。
  • 残りのすべてのスクリプト(つまり、Editor フォルダー内のスクリプト)。

という順序でソースコードのコンパイルが行われています。コンパイルが行われるタイミングはprocess explorerで見る限りだいたい

build

  • ソースコードが変更された状態でUnityにフォーカスが当たった時(AutoRefresh有効時)
  • Playボタンをおした時
  • UnityVSでビルドした後にUnityにフォーカスがあたった時?(Autorefresh関係なし)
  • Refreshを実行した時(AutoRefresh無効時)

というぐらいかと思います。

こんな感じで依存関係を持ちつつビルドをしているので、各種ビルドプロセスに時間がかかっていると Playボタンを押してもなかなか反応ないなー、という自体に陥ります。

Csharpのビルド

Windows版のUnityの場合ですが、ビルドジョブが追加されるとProjectディレクトリ/Temp以下にUnityTempFile-%%HASH%%という ビルド対象のファイルと設定が列記されたファイルが必要な数(上記のスクリプトコンパイル順の話ですね)だけ生成されます。

このビルド設定ファイルを使ってビルドを実行します。こんなかんじ。 設定ファイルは-out:Temp/Assembly-CSharp.dllと記載されているやつをやるのが良いと思います(大抵一番おおきくなるのはここなので)

"C:\Program Files\Unity\Editor\Data\Mono\bin\mono.exe" "C:\Program Files\Unity\Editor\Data\Mono\lib\mono\unity\smcs.exe" Temp/UnityTempFile-3baae96cd9a983f4ab517457ffee2e70

この状態Assembly-Sharpですぐにビルド終了するのであればPlayボタンおしてすぐ確認出来る健全な状態です。 が、数秒かかるようであればソースコード変更後にPlayボタンおしても10秒ぐらいうんともすんとも言わない、みたいな状況になります。 (だいたい、こんな状況になっている場合は対象のcsファイルが1000単位であると思いますが、、)

ビルド速度の改善方法の模索

VisualStudioでビルドすれば1000ファイル程度が対象であってもすぐにコンパイルが終わるのでdllを流用する、という方法も なくもないのですが暗黙的にmonoでのビルドが始まってしまうようなのでこれはあまり効果が期待できません。

で、一番安牌だと思うのはプロジェクト内でも適切にコードを分割しておいて個別にdllをつくるのがオススメです。 なるべく直接ハードコーディングするような仕組みはやめて適切にライブラリ化してdllをビルドして配置しておけば 日々の確認が楽になりますよ。

AssetStoreで購入したものも1手間かかりますが、自前でdllにしてUnityプロジェクトで配置するようにしておけばビルド時間への 影響も軽微にできるのでおすすめです。(中にはUnityEditor参照を直接かいてるようなお行儀の悪いコードがあって面倒なことも有りますが)

なにか他によさそうな案があればおしえていただけるとうれしいです。

ではでは。



Copyright© 2016, chobie All rights reserved.