CGBoxの一部の記事にはアフィリエイト広告が含まれております。
【Unity】軽量化する方法!物理演算の描画負荷を減らそう

こんにちは!Unityでゲーム作りを進めていると、だんだんと動作が重くなってきた…ということがありますよね。
そんな時はワールドを軽量化して動作を軽くしてあげなければなりません。
ただ重くなっている原因と解決法はワールドによって違うので、様々な軽量化の方法を試していく必要があります。
そこで本記事では、色々な軽量化する方法を紹介していきます!
軽量化とは

ここでいう軽量化とは、Unityプロジェクト内の様々な処理を軽くすることです。
ワールドを作り始めたばかりのときはオブジェクトが少なく快適に動作しますが、
3Dモデルが増えてくるとだんだん描画処理の負荷がかかり、
ゲーム実行時の動作が重かったり画面がカクカクするといった問題が生じてきます。
そんな時にカメラの設定や、3Dモデルの描画の設定などを見直して軽量化する必要がでてきます。
軽量化する方法
ここでは軽量化する方法を場合に分けて紹介していきます。
軽量化する方法一覧
ライトベイクで描画負荷を減らす
ライトマップのベイクで光の当たり方を事前に計算しておけば
リアルタイムで行う処理の負荷を下げることができます。
ライトマップのベイクの方法については下の記事で解説しています。

オクルージョンカリングを設定する
オクルージョンカリングとは、あるオブジェクトがほかのオブジェクトに隠れていて
カメラに映らない時に、オブジェクトのレンダリングを無効にする機能のことです。
オブジェクトの多いシーンでこれを設定していないと、
カメラから遠い必要のないオブジェクトの描画まで行われてしまい重くなってしまいます。
オクルージョンカリングの詳しい設定方法については下の記事が参考になります。

3Dモデルのメッシュを軽量化する
複雑な3Dモデルをたくさん使うと当然プログラムは重くなってしまいます。
そんな時に試してみたいのが3Dモデルのポリゴン数を減らし軽量化するアセットです。
3Dモデルのメッシュを簡単に軽量化できるアセットはUnityアセットストアで
提供されているので、おすすめアセットの項目で紹介します。
2Dゲームの軽量化
2Dゲームを作る際には、タイルマップを使うと軽量化することができます。
タイルマップの作り方については下の記事で詳しく解説しています。

タイルマップを使えば一つのタイルを繰り返し使用するため
一つ一つオブジェクトを作るよりもゲームオブジェクトの種類が少なくなります。
オブジェクトはそれぞれがTransformやColliderなどの情報を持つので
種類が多ければ多いほど計算に負荷がかかり重くなってしまいます。

個別にオブジェクトを作っていて2Dゲームが重たい時は、
タイルマップに置き換えることを検討してみましょう!
大量のオブジェクトを軽量化
ゲーム開発をしていると、同じオブジェクトを大量に生成したい場合があるかと思います。
数十個くらいなら処理できても、100個や1000個を超えてくるとどうしても重くなってしまいます。
このようにヒエラルキーに全てのオブジェクトを配置してしまうと、
毎フレームごとに計算が発生し負荷がかかってしまいます。

そんな時に使えるのが、ゲームオブジェクトを作らずにスクリプトからメッシュを描画できるDrawMeshというメソッドです。
DrawMeshを使えば、一つ一つゲームオブジェクトを生成するよりも軽量に、大量のオブジェクトを描画することができます。
オブジェクトを大量生成したい場合にぜひ利用してみましょう!
DrawMeshの使い方については下の記事が参考になります。
RenderTextureを使って軽量化
RenderTextureと、Culling Maskという機能を使ってプロジェクトを軽量化することができます。
それぞれの機能は後に説明しますが、実現したい内容としては以下の通りです。
更新頻度の低いゲームオブジェクトをテクスチャとして表示して軽量化する
それではまずRenderTextureとCulling Maskがそれぞれどんな機能かを見ていきましょう。
RenderTextureとは
RenderTextureとは、カメラの映像を投影できるテクスチャのことです。
RenderTextureの使用例として、下のGIF画像のようなものがあります。

これは左の3Dモデルの表面にRenderTextureを貼り付けており、
それによってリアルタイムでカメラの映像を写しているようなモニターを表現しています。
このRenderTextureですが、工夫次第でいろいろな使い方ができます。
Culling Maskと組み合わせて軽量化に使う
Culling Maskとは、特定のゲームオブジェクトだけをカメラに映す機能のことです。
CullingMaskを使えば特定のゲームオブジェクトだけをカメラに映すことができ、
不要なオブジェクトは非表示にできるので、描画処理が軽量化できます。
つまり、RenderTextureとCulling Maskを使って下のような手順で軽量化することができます。
- RenderTextureで更新頻度の低いゲームオブジェクトをテクスチャとして保存する
- 保存したテクスチャを3Dモデルに貼り付け画面に表示する
- Culling Maskで更新頻度の低いゲームオブジェクトの描画をオフにする
これにより、あまり動かないゲームオブジェクトの描画をオフにして軽量化しつつ、
テクスチャとして画面に表示することができるので、ゲームの見た目を変えずに軽量化ができます。
RenderTextureとCullingMaskの具体的な設定方法については下の記事が参考になります。
軽量化するおすすめアセット
Mesh Optimizer


こちらは3Dモデルのメッシュを軽量化できる無料アセットです。
オブジェクトにスクリプトを取り付けるだけというUnity上での簡単な操作で
3Dモデルのポリゴン数を減らして軽量化することができます。
Mesh Simplify

こちらは、1クリックで3Dモデルのメッシュを削減し軽量化してくれるアセットです。
軽量化する際に、ポリゴン数をより減らしたい箇所と減らしたくない箇所を指定することができます。
軽量化と3Dモデルのクオリティを両立できる便利アセットです。
まとめ
以上、Unityのワールドを軽量化する方法について解説してきました。
まとめると、下のような方法があります。
- ライトマップのベイクやオクルージョンカリングでカメラの描画を軽量化
- タイルマップで2Dマップを軽量化
- DrawMeshで大量のオブジェクト生成を軽量化
- RenderTextureを使って軽量化
- アセットでメッシュを軽量化
有効な軽量化の方法はワールドによって違ってくるので、最適な方法を見つけたいですね!