今回はタイトルの通りで「Unityを使ったオープンワールドゲームの作り方」のまとめをしていく記事です。
私は(執筆時点で)小規模なオープンワールドゲームを5作品完成させているのですが、その中で「このジャンルのゲームを作るうえでこの知識はぜひ知っておきたかった!」ということがいくつもあります。
そこでここでは「オープンワールドゲームを作りたい!」と思っている方のために、私が今までの活動で得た知見を元にオープンワールドゲームの開発に必要な知識を一通りまとめていきますね。
※以下、かなりの長文です。
オープンワールドゲームとは?
でははじめに「そもそもオープンワールドゲームとは何か?」「どんな特徴があるのか?」という部分を簡潔に説明しようと思います。
オープンワールドゲームの定義
まずオープンワールドゲームとは、一言でいえば「広大なフィールドを、ロードを挟まずに自由に移動できる3Dゲーム」のことです(※定義には諸説あります。これは私なりの解釈です)。
なので基本的には見えるところにはロードなしで行くことができるのがこのジャンルのゲームとしての最低条件となります。
…とはいえ、正直なところ定義が曖昧なので
- 具体的にフィールドがどのくらい広ければオープンワールドなのか?
- フィールドが広くても行動可能な範囲が狭ければ違うのか?
- 広いフィールドが2個以上あって、そこの行き来にはロードが必要な場合は違うのか?
などといった解釈は人それぞれだと思います。この辺は作者とプレイヤーさんのイメージが食い違う可能性があるので注意した方が良いかもしれません。
オープンワールドゲームの特徴
次にオープンワールド形式は最近の大作ゲームでは主流になっているわけですが、いったいなぜこの形式が人気なのでしょうか?その理由はオープンワールドには次の2つの特徴があるからです。
- ゲームの自由度を高くすることができる
- ゲームへの没入感を高めることができる
特徴1:ゲームの自由度を高くすることができる
1つ目はゲームをオープンワールド形式にすることで、ゲームの自由度を高くすることができるからです。
定義のところに書いた通りオープンワールドゲームではフィールドを自由に動き回ることができます。したがってゲームによっては最初からラスボスのところへ行けたり、作者が意図しなかった場所に入り込んだりすることができる場合もあります。つまりゲーム的には移動の自由度がとても高いというわけですね。
そして色々な場所に好き勝手に行けるということは、プレイヤーの「やらされている感」を薄める効果があります。その結果としてプレイヤーは「自分の好きなように楽しんでいいんだな」と感じるようになり、主体性が刺激されて本来の遊び方とは違う楽しみ方を見つけたりするきっかけになるのです。
このようにプレイヤーの主体性を引き出し、自由に楽しんでもらいやすい点はオープンワールドの大きな魅力の一つだと思います。
特徴2:ゲームへの没入感を高めることができる
次に2つ目はロードがないことでゲームへの没入感を高めることができるからです。
こちらの話は単純で、フィールドを移動したときにロードや暗転があると「ああ、やっぱゲームやってるんだな」という感じがありますが、ロードがないオープンワールドではそこで萎えることがありません。これによってプレイヤーは広い世界を冒険する主人公になりきることができ、高い没入感を得ることができます。
オープンワールドゲームを作るうえで知っておくべきこと
ではオープンワールドゲームの概要はこのくらいにして、ここから本題である「オープンワールドゲームの作り方」について説明していきます。
まずはオープンワールドゲームを作るうえで是非知っておいていただきたいことを2つご紹介しますね。
- 処理が重くならないように徹底的に最適化する必要がある
- オープンワールドは直線的なストーリーとの相性が悪い
処理が重くならないように徹底的に最適化する必要がある
1つ目は、オープンワールドゲームでは最適化の知識が必須だということです(※最適化=無駄な処理を省いてゲームを高速化すること)。
ではなぜ最適化が必要なのでしょうか?その理由はオープンワールドゲームでは大量のオブジェクトをロードして描画する場合が多いからです。当然ながらたくさんのオブジェクトをロードするほどメモリを圧迫しますし、たくさんのオブジェクトを描画するほど処理が重くなるので、何も考えずに作るとあっという間に重いゲームになってしまいます。したがってオープンワールドゲームの開発では徹底的な最適化が必要です。
オープンワールドは直線的なストーリーとの相性が悪い
次に2つ目は、意外かもしれませんがオープンワールドゲームは直線的なストーリーとの相性が悪いということです。
この理由はオープンワールドに明確なストーリーが入ることでせっかくの自由度が制限されてしまうからです。ゲームのストーリーといえば決まった物語をなぞるように進む場合が多いと思うのですが、それをオープンワールドに導入すると結局は普通のゲームと同じようにストーリーをなぞって決まった場所に行くだけになりがちで自由度がつぶれてしまいます。これではオープンワールド形式にする意味がありません。
実はこの問題は超大作ゲームでも見過ごされがちで、作りこみがすごいオープンワールドなのに全然自由に感じられない場合があるのはこの相性問題によるものだと私は思います。もちろん「広大な世界を自由に歩けるんだから壮大なストーリーを入れたいよね」という気持ちはわかりますが、それで自由度がなくなってしまっては元も子もないでしょう。
このような点を考えると、オープンワールドゲームのストーリーに関しては
- プレイヤーが自由にゲームを進めても破綻がないようにする
- そもそも明確なストーリーを導入せず、ゲーム世界に散りばめられたフレーバーから世界背景を考察してもらうようにする
といった工夫をする必要があるでしょう。
Unityでオープンワールドゲームを作るときのポイント
次に、以上の内容を踏まえてUnityでオープンワールドゲームを作るときのポイントを詳しく説明していきますね。
- Unityで描画負荷を軽くするための最適化テクニック
- Unityで必要なオブジェクトだけをロードする最適化テクニック
- オープンワールドゲームのフィールドの作り方のポイント
Unityで描画負荷を軽くするための最適化テクニック
まずはUnityで描画負荷を軽くするための最適化テクニックを6つご紹介します。下記はオープンワールドゲームに限らず、幅広い3Dゲームで役に立ちますし簡単に行えるのでこの機会にぜひ覚えておいてください。
- Terrainの設定を調整する
- LODグループを活用する
- カメラのカリング設定を調整する
- メッシュを結合して最適化する
- なるべく同じマテリアルを使う
- オクルージョンカリングを設定する
Terrainの設定を調整する
一つ目はTerrainの設定を調整して描画の負荷を軽くすることです。これについては以下の記事
に詳しい話を書いたのでそちらもご覧いただきたいのですが、ザックリ言うと
- 巷では「Terrain=重い」などと言われるが、それは設定が悪いせいでTerrainのせいではない
- ピクセル許容誤差やハイトマップ解像度、ディティール密度等をうまく調整することで見栄えと描画負荷のバランスをとることができる
という感じです。Unityでオープンワールドを作る際にはほぼ確実にTerrainのお世話になると思うので、Terrainの癖をうまく理解して設定できるようにしましょう。
LODグループを活用する
次に二つ目はLODグループというメッシュ表示機能を活用することです。この機能を使うことで
- 近くのゲームオブジェクトのメッシュは滑らかに
- 遠くのゲームオブジェクトのメッシュは雑にしたり、非表示に
することができ描画負荷の削減に役立ちます。
LODグループについては公式マニュアルをご覧ください。
カメラのカリング設定を調整する
三つめはカメラのカリング設定を調整して遠くのメッシュを非表示にすることです。やり方はとても簡単で、カメラコンポーネントの「クリップ面」の「ファー」の値を小さくするだけです。
例えば、上の画像なら「ファー」が1000なので、1000mよりも遠くのメッシュは表示されなくなります。こうすることで遠くに表示されるゲームオブジェクトの描画を省略して処理を軽くすることができます。
メッシュを結合して最適化する
四つ目はメッシュを結合して描画処理を最適化することです。
Unityでは基本的に別々のメッシュは1つずつ描画処理が走ります。つまりばらばらのメッシュが大量にあると処理が重くなってしまうのです。そこでメッシュを程よい粒度で結合させると描画処理を軽くすることができます。ただこの方法はUnityの標準機能だと実現が難しいため、Probuilderのメッシュ結合機能やアセットを使うなどして対処しましょう。
ちなみにメッシュを何でもかんでも結合すればよいというわけではないので、その辺は勘違いしないように注意してください。例えば広範囲に散らばっているメッシュを一つに結合すると、描画処理の呼び出し回数こそ減りますが結合メッシュがカリングの対象外になってしまい逆効果…なんてことも考えられます。なのであくまでも適切な粒度で行うことが必要です。
なるべく同じマテリアルを使う
五つ目はなるべく同じマテリアルを使うことです。
先ほど「別々のメッシュは1つずつ描画処理が走る」と書きましたが、例外として別々のメッシュでも同じマテリアルを使うことで描画処理を削減できる場合があります(これを「バッチング」といいます)。つまり、フィールドの岩など大して重要ではないオブジェクトの場合は同じマテリアルを使いまわした方が処理的には軽くなると言えます。
※なおバッチングについての説明は株式会社ロジカルビート様のブログが詳しいのでそちらを参考になさってください。
オクルージョンカリングを設定する
六つ目はオクルージョンカリングを設定することです。オクルージョンカリングを使うと、遮蔽によって隠されたメッシュを非表示にして描画負荷を軽くすることができます。
オクルージョンカリングの設定方法は以下の記事で詳しく説明していますので、そちらも併せてご覧いただければと思います。
Unityで必要なオブジェクトだけをロードする最適化テクニック
描画処理の最適化の次はロード処理の最適化も行うとベターです。これに関しては下記の記事で詳しくご説明していますので併せてご覧ください。
ただしロードの最適化は上級者でも一苦労するレベルなので、もし作りたいオープンワールドゲームが
- 比較的小規模なオープンワールドである
- フィールド上に配置されているオブジェクトの種類がそこまで多くない
といった場合は目を瞑ってもそこまで大きな問題にはならないと思います。
オープンワールドゲームのフィールドの作り方のポイント
さて最適化の方法についてはこのくらいにして、最後にフィールドの作り方のポイントをご紹介していきます。主なポイントは次の3つです。
- 無料のTerrain Toolsを活用する
- 世界の端が見えないようにする
- フォグ(霧)を活用して遠くを自然に隠す
無料のTerrain Toolsを活用する
まず一つ目のポイントとして、オープンワールドのフィールドをUnityで作るときは無料のTerrain ToolsというUnity公式パッケージを活用すると便利です。
Terrain Toolsは標準のTerrainエディタの機能を拡張するパッケージで、
- 浸食をシミュレーションする機能
- 段差やスロープを簡単に作る機能
- Terrainレイヤーの管理を便利にする機能
などが追加されています。また、インストールはパッケージマネージャから簡単に行うことが可能です。ここでは使い方の紹介は割愛しますが、標準のTerrainエディタと比べるとかなり思い通りの地形を作れるようになるのでお勧めです。
なおTerrainを作るにあたっては「Gaia」など秀逸な有料アセットもあるのですが、Unity2021以降のバージョンではTerrain Toolsも実用的になってきましたし、何より無料かつ軽量なのは魅力的なのでこれを使わない手はありません。ぜひ活用してみてください。
世界の端が見えないようにする
次に二つ目のポイントは、オープンワールドのフィールドを作るときは「世界の端」が見えないように作るとよいです。
いくらオープンワールドが広いとはいえ、隅々まで探索していたら
- 世界の端が見えてしまった
- なぜか見えない壁があって進めない
- 「この先には何もない」などのメッセージが表示され、強制的に戻される
なんてことがあったら興ざめですよね。なのでそこはプレイヤーが登れない山脈で囲うといった自然な工夫が必要だと思います。
フォグ(霧)を活用して遠くを自然に隠す
さて、最後に三つ目のポイントは「フォグ」(=霧)を使って遠くを自然に隠すと見栄えを保ちつつ描画処理をカットできるのでお勧めです。
これは例えばの話ですが、上の方で紹介したカメラのカリング機能を使うと地形やオブジェクトが途中でブツッと切れて表示されてしまうことがあり不自然に見えてしまいます。そこでフォグをかけることでそのような不自然になってしまった部分を自然に隠すことが可能です。
ただしUnity標準のフォグ単体だとあまり良い見栄えにならないことが多いため、アセットも併用することをお勧めします。フォグ用のアセットは色々ありますが、中でも「Volumetric Fog&Mist」は使いやすくて動作も軽いのでおススメです。
おわりに
以上、長文になってしまいましたが「オープンワールドゲームの作り方」について必要な知識を一通りまとめてみました。特に最適化の部分は非常に重要なので覚えて帰っていただければ嬉しいです。
それにしても、今までオープンワールドゲームを何作も作ってきて分かったのは「オープンワールドゲームは奥が深くて作るのが楽しい」ということです。せっかくUnityを使っているならこんなに楽しいジャンルを作らないのはもったいないと思うので、皆さんもぜひオープンワールドゲームの制作にチャレンジしてみてください。
ちなみに具体的なオープンワールドのフィールドの作り方は下記の記事でご説明しています。そちらも併せてご覧頂ければと思います。
この記事がゲーム開発のお役に立てば幸いです。