painRe:inのロードシステムについて
こんばんは、がぷがぷ工房です。
今日はステージ構成の話をさせていただきます。
ゲームの開発での後悔話が多いので、開発に興味がある方は是非ご覧ください。
painRe:inのローディングの仕組み
「painRe:in」のステージは、ストリーミングロードを使用しています。
これは言うなれば、オープンワールドの様なもので
「エリア1」「エリア2」「エリア3」で区切られてはいますが
「エリア1」はずっと地続きで設計されています。
この全てを一度にロードすると凄く大きな負荷になってしまうので
主人公の位置から、必要なステージのユニットのみをロードしています。
ドアに入る前にゲームが重くなることがあると思いますが、
このタイミングでドアの先にあるエリアを読み込んでいる感じです。
なぜこの仕組みにしたのかというと、
ずばり「オープンワールドゲームへの憧れ」でした。
広大なフィールドで、主人公が好きな場所へ行ける仕組みを基盤として作ってしまえば
どんなゲームでも作れるハズだと、私は思っていました。
しかし現実は甘くありませんでした・・・orz
ストリーミングロードの落とし穴
①エリアが二つ読み込まれる地点が発生してしまう
例えば「ステージ1」で「ステージ2」を読み込ませた時に
「ステージ1」を削除してしまうと、主人公は奈落へと落ちていきます。
主人公が「ステージ1」を離れるまで「ステージ1」を保持しておく必要があります。
この間、ゲームは「ステージ1」と「ステージ2」を同時に読み込んでいる状況となり
非常に描写コストが上がります。
②ロードフリーズ
先に言った通り、ステージを読み込む時にゲームにフリーズが生じています。
このフリーズを極力少なくするために、事前にステージを読み込むなどの処理を入れていましたが(現在は入れていません)ほとんど改善しませんでした。
③ステージ構成に自由が利かない
「エリア1-1」から「エリア1-5」は地続きで設計されています。
「エリア1-2」が「エリア1-1」の領域に入った場合、「エリア1-1」が読み込まれてしまい、二つのエリアが重なり合ってしまいます。
他のエリアと干渉しないか調べながらステージを作る必要があり、これは大きな障害です。
④Zファイティング
これが私が最も今のシステムに後悔している要素です。
Unityは、ゲームオブジェクトが原点から遠くなる程に誤差が生じます。
通常はほとんど気になりませんが「painRe:in」にとってはこれが致命的でした。
この影響により、ステージのスタート地点から離れるにつれて主人公の見た目に違和感が生じます。
例えば、「ゴブリンの巣窟」の「ステージ4」は原点からおおよそ500mの距離あります。
この地点で、肌にぴっちりと密着させている靴下がチラついています。
※これはandroid版でのみ発生していると思われます。
原点から離れたゲームオブジェクトのポジションに、ごくわずかな誤差が生まれ
靴下と素肌の正しい描写が出来ずにチラ付いているという感じです。
これは不具合ではなく、Unityの仕様だと思います。
次作へ思いをはせて
今作はこのまま製作を進めたいと思っています。
次作では、ステージのユニットを明確に切り分けて
主人公が原点座標からあまり離れないような仕組みにしたいです。
しかし、それぞれのエリアの最後には、この仕組みだから出来る特別なステージを用意しています。
少しだけ楽しみにしてお待ちください。
進捗
「エリア1」にある「釣り天井トラップ」のパワーアップバージョンを作りました。
このトラップは即死では無いのですが
オーバーキル状態だとバラバラになります。
(こんなものに潰されたら流石に即死であるべきでしょうか・・・。)
串刺しビリビリもあります