CGBoxの一部の記事にはアフィリエイト広告が含まれております。
Unityが重いときの原因・最適化して改善する方法解説!
こんにちは!Unityで開発を進めていると、だんだんと動作が重くなってきた経験がありませんか?
動作が重いとストレスが溜まりますし、できるだけ快適に開発したいですよね。
そこで本記事では、そんなUnityが重いときの原因と最適化して改善する方法を解説していきます!
Unityが重い時の原因一覧
まずは、Unityが重くなるそもそもの原因を考えてみましょう。
重い処理を行っている
Unityが重い時の原因として、以下のような例が考えられます。
- Quality設定が最適化されていない
- 重いアセットや3Dモデルを利用している
- UIが多くありその更新処理が多い
- ライトベイクを行っていない
- スクリプト上で重たい処理を行っている
本記事では、これらの場合の解決方法を紹介していきます。
PCのスペック不足で重い
そもそもどのくらいの重い処理に耐えらるかは、PCのスペックによって決まります。
先に挙げた重い処理を行っている場合でも、ハイスペックなパソコンで開発をしていれば快適に動作することもあります。
逆にスペックが足りていない古いパソコンを使っていると、少しアセットを使っただけでも重くなってしまいます。
具体的に必要なスペックについては下の記事で解説しています。
Unityが重い時の最適化・軽量化する方法
Unityが重い時の解決方法を一つずつ解説していきます。
クオリティ設定を見直そう
Unityのクオリティ設定を見直すだけでも、重さが改善される場合があるので試してみる価値はあります。
Quality設定はUnity上部のEdit→Project Settingsから開くことができます。
まずはQualityの設定を下げて動作を確認してみましょう。
Defaultとなっているところから設定を変えることができます。
Qualityページから設定できる、負荷に関わる項目を他にもいくつか紹介していきます。
Pixel Light Count
Renderingの項目にPixel Light Countがあります。
これはオブジェクトに当てられるライトの数の制限を表しています。
デフォルトでは4になっていましたが、数字が大きいほど負荷がかかるので小さい数字を設定しましょう。
Shadows
Shadowsは影の設定項目です。
Shadow Resolutionの設定を高くしていると影のクオリティは高くなりますが、その分負荷も増えてしまいます。
プロジェクト次第ですが、影のクオリティが必要なければResolutionを下げる
もしくは影が全く必要なければShadowsからDisable Shadowsを選ぶことで影が描画されなくなります。
VSync Count
Renderingの項目にVSync Countがあります。
こちらをDon’t Syncにすることでフレームレートを指定して固定することができます。
ゲームに応じたフレームレートを設定することをオススメします。
Dont ‘t Syncに加えて、スクリプト内に下のコードを記述することでフレームレートが固定できます。
Application.targetFrameRate = 60;
フレームレートの設定方法について詳しくは下の記事で解説しています。
その他オフにすることで負荷を下げる項目
Quality設定にある以下の項目はオフ(Disabled)にすることでゲームの負荷を下げることができます。
プロジェクトに必要なさそうな処理はオフにするようにしましょう。
- Anti Aliasing→アンチエイリアス処理
- Realtime Reflection Probes→反射・映り込みの表現
- Texture Streaming→テクスチャをメモリにロード、メモリからアンロードするシステム
- Soft Particles→パーティクルの描画設定
UIのCanvasを分ける
UnityでUIを使うときにはCanvasを用いてその中に配置していきます。
このCanvasですが、一つのCanvasの中にすべてのUIを配置するのはオススメしません。
Unityではプログラムの途中であるUIを更新する処理が入った場合、そのUIが所属するCanvasのUIすべてをチェック・更新する処理が入ってしまうのです。
そのためCanvas内のUIの数が多ければ多いほど、更新時に負荷がかかりパフォーマンスが悪化します。
それを避けるために、Canvasを複数個作り更新頻度の高いUIは一つのCanvasにまとめて配置し
更新頻度の低いUIは別のCanvasに配置するのがオススメです。
ライトベイクで描画負荷を減らす
ライトマップのベイクで光の当たり方を事前に計算しておけば
リアルタイムで行う処理の負荷を下げることができます。
ライトマップのベイクの方法については下の記事で解説しています。
重たいコードの数を減らす
Unityで使う構文の中には重たい処理になってしまうものもあります。
代表的なものとしては、GameObject.Find系の処理です。
Findはヒエラルキー上のオブジェクトを一つずつ全てチェックしてしまいます。
Findを多用するのは避け、下のようにインスペクター上からゲームオブジェクトを予め設定できるようにするのがオススメです。
GetComponentの処理に関しても同様です。
例えばRigidbodyを取得したい場合はよくありますが、これもインスペクターから登録しておくことで負荷を下げることができます。
ゲームオブジェクトを軽量化・カメラの描画設定を見直す
他にも最適化・軽量化を行う方法として以下のようなものがあります。
- オクルージョンカリングを設定する
- 3Dモデルのメッシュを軽量化するアセットを使う
- タイルマップを使って2Dゲームを軽量化する
- DrawMeshで大量のオブジェクトを描画する
- RenderTextureでカメラの描画負荷を下げる
これらの方法については下の記事で解説していますので、参考にしてみてください。
重い処理を非同期処理する
何万回もの繰り返し処理のような重たい処理をスクリプト内で行っていると
プログラム実行時に画面が一瞬止まるような動作になることがあります。
これを避けるために、非同期処理を行うというものがあります。
非同期処理を行えば、画面の描画に影響を与えずに同時進行で計算を行えるようになります。
非同期処理の詳しい設定方法については下の記事が参考になります。
おすすめアセット
Build Report Tool
Build Report Toolは、ビルドレポートによりどのアセットが容量を圧迫しているかを教えてくれるアセットです。
プロジェクトに含まれているけど使われていないアセットを特定し、削除することもできます。
軽量化したいと考えている人にとって非常に役立つアセットです。
Scene Optimizer
Scene Optimizerは、シーンを最適化してプロジェクトを軽量化したいときに役立つアセットです。
シーンに配置したオブジェクトを一つ一つ軽量化するのは非常に手間がかかります。
そんな時このアセットを使えば簡単な設定だけで、すべてのオブジェクトを一度に軽量化してくれます。
まとめ
以上、Unityが重いときの原因・最適化して改善する方法を解説してきました。
プロジェクトを最適化して、快適にゲーム開発を行っていきたいですね!