金で解決する!Unityの絵作り
はじめに
この記事は「Unityゲーム開発者ギルド Advent Calendar 2022」の5日目の記事です。
内容としては、Unity 1週間ゲームジャム お題「そろえる」で投稿したゲーム「物狼」のステージ作成時に、いい感じの見た目にするために作業した(検討した)こととその手順、金には糸目をつけずに利用したアセット(+使えそうなアセット)を備忘録としてまとめたものになります。
各手順で使用したUnityの機能やアセットの使い方の細かい説明などは割愛していますので、より詳しく知りたい部分は、インターネットの検索や各アセットのマニュアル等をご活用ください。
開発環境
- Unity 2021.3.4f1
- URP 12.1.7
1. 3Dモデルの準備
3Dモデルは、個人的お気に入りのパブリッシャー「Synty Studios」の「Simple Apocalypse Interiors - Cartoon Assets」を使用しました。こちらのパブリッシャーのアセットは、お買い得なバンドルが用意されていたり、定期的にセール対象になる印象があるので、気になるものをセール時に購入しておくのもおすすめです。
2. ポリゴン数の削減
今回は利用しませんでしたが、3Dモデルをもう少し軽いローポリモデルに修正して使いたいという時には「Mesh Simplify」が便利です。非常に簡単に使えて、任意の部分ごとにポリゴンを削減する割合を細かく指定するなど、かなり柔軟な調整もできます。
「Mesh Simplify」で人型モデルの頭部を保護しつつ、身体の頂点数だけを約半分に減らしている図
また、LOD(Level of Detail)を使うなら、LODを自動的に生成してくれるアセットなどを利用するのも良いです。(ちなみに「Automatic LOD」には「Mesh Simplify」が含まれています)
さらに、遠景のモデルなどをビルボードとして表示することで、劇的に描画の負荷を軽減できる可能性を秘めた「Amplify Impostors」なども要チェックでしょう。
3. 衝突判定の追加
モデルのPrefabにColliderがついていない時には、適切なColliderを追加します。
- 単純な形状なら、
BoxCollider
(またはSphereCollider
かCapsuleCollider
) - 複雑な形状なら、
MeshCollider
にするのが基本になるでしょう。単純な形状ではないが、単純な形状の組み合わせで構成されているモデルなら、無料アセット「SAColliderBuilder」でColliderを自動生成すると楽です。
「SAColliderBuilder」で壁の衝突判定を複数のBoxCollider
で構成している図
また、手動でColliderを編集したいなら「Technie Collider Creator 2」などが便利でしょう。
4. レベルデザイン
モデルのPrefabの調整が済んだ後は、ひたすら手作業でシーンにゲームオブジェクトを配置していきます。効率的にオブジェクトを配置したり位置を調整したりするには、あらかじめシーンビューのショートカットキーやスナップの方法などを覚えておくと良いかなと思います。
5. メッシュの結合
シーンに大量のオブジェクトを配置すれば、当然それだけ描画の負荷が大きくなります。この負荷を軽減する方法の一つは、複数のオブジェクトのメッシュをひとまとめに結合することになるでしょう。そしてそれが出来るアセットといえば「Mesh Baker」が有名かと思います。
注意が必要なのは、何も考えずにメッシュを結合してしまうと、視錐台カリングやオクルージョンカリングの効率が低下してしまい、逆に無駄な描画が増えて負荷が大きくなってしまう可能性があることです。どの程度メッシュを結合するのか?ちゃんと軽くなっているのか?は、必ずプロファイラーなどで計測しながら試す必要があるでしょう。
また、URPならSRP Batcherで、マテリアルが異なってもシェーダーが同じならまとめて描画される仕組みがあるため、場合によってはメッシュを結合する恩恵は少ないかもしれません。
今回は利用しませんでしたが、「Mesh Combine Studio 2」とその拡張「MCS Caves & Overhangs」は合わせて使うことで、セルベースで自動的にメッシュを結合しつつ無駄なジオメトリの削除も行ってくれるようになるため、個人的にはこちらの方が好みでした。
「Mesh Combine Studio 2」でグリッドのセルに合わせたメッシュ結合を試してみている図
6. ライトマップのベイク
ライティングの負荷を抑えつついい感じの見た目にするため、ここでライトマップを焼きます。Unity標準でライトマッパーが用意されているので、まずはそれを使ってみるのも良いでしょう。
今回Unity標準のライトマッパーを試してみた所、割と不安定なことがあったり、個人的にクオリティに満足できないことも多かったりしたので、評判の良い「Bakery - GPU Lightmapper」を使用することにしました。Bakery信者として言わせてもらうと、非常に高いクオリティと小さいテクスチャサイズでライトマップを焼くことができたので大満足、超おすすめアセットです。
「Bakery - GPU Lightmapper」でライトマップを焼く前(左)と焼いた後(右)の図
7. ライトプローブの配置
プレイヤーが操作するアバターなど(非Staticなゲームオブジェクト)に対してライトマップは焼けませんが、ライトプローブを配置することでライティングの効果を与えることができます。
ライトプローブを手作業で配置するのはかなり大変なので、設定やジオメトリに合わせて自動でライトプローブを配置してくれるアセット「Magic Light Probes」を利用しました。作成したゲームはかくれんぼの要素を持つため、ライトプローブを多めに配置することで、プレイヤーが周囲の環境から浮いて見えずに、自然に溶け込みやすいようにしています。
「Magic Light Probes」で大量のライトプローブを自動的に配置している図
ライトプローブ反映前(左)と反映後(右)の、非Staticオブジェクトの見え方の図
8. リフレクションプローブの配置
疑似的な反射や映り込みの効果を出すなら、リフレクションプローブを配置しましょう。
作成したゲームはかくれんぼの要素を持ち、反射や映り込みから環境(Staticなオブジェクト)とプレイヤー(非Staticなオブジェクト)を区別できるようにしたくなかったため、今回は配置しませんでした。ちなみにちゃんと配置すれば、以下の図のようになります。
仮でリフレクションプローブを配置して、金属の質感の球を置いてみた図
9. ポストプロセスの適用
カメラにポストプロセスを適用すると、かなりいい感じの画面エフェクトがかけられるので、特段の理由がないなら絶対に設定しておいた方が良いでしょう。あまりやりすぎると、逆に見た目が変になったり、描画の負荷が大きくなりすぎたりすることもあるので、一応注意は必要です。
作成したゲームでは、以下のような5つのポストプロセスエフェクトを適用しています。
この中で、画面の輝度やコントラストを調整できるTonemapping、LUTテクスチャを渡すだけで画面全体の色調を補正して雰囲気を変えたり統一感が出せるColor Lookup、いい感じの発光効果を与えるBloom、写真風の見た目にするVignette、などは個人的によく使用しています。
LUTテクスチャはフリーで配布されているものもあるので、それを使うのも全然アリです。今回はバンドルで購入していたアセットの「Amplify LUT Pack」から選んで使いました。
ホラー映画風に設定したポストプロセスの適用前(左)と適用後(右)の図
10. フォグの設定
Unity標準のフォグを有効にして設定すると、お手軽にそれっぽい空気感が表現できます。
以下の図では違いが少しわかりにくいかもしれませんが、奥の階段辺りは薄っすらと霧がかっているのがわかるかと思います。
フォグ設定前(左)と設定後(右)の図
11. オクルージョンカリングの設定
オクルージョンカリングの設定をすると、他のオブジェクトに隠されているオブジェクトの描画が無効になるので、描画の負荷を軽減できます。今回作成したゲームのステージのような、屋内かつ複数の小さい部屋に分かれているような構造などの場合は、特に軽減効果が大きいです。
オクルージョンカリングで壁に隠されているオブジェクトの描画が無効になっている図
今回は、Unity標準より効率的なオクルージョンカリングが実行できるアセット「Perfect Culling - Occlusion Culling System」で、さらに描画の負荷を軽減することができました。
おわりに
いかがでしたか? 今回は有料で購入できるアセットを惜しみなく利用して、3Dゲームの見た目をいい感じにする方法を紹介しました。この記事が何かしらのお役に立てれば幸いです。
ちなみに作成したステージ上で、プレイヤーが操作するアバターなどを自由に動かすなら、最近無料になったアセット「Kinematic Character Controller」はチェックしておきましょう。
Discussion