概要
ロールバックネットコードを取り入れた格ゲーを作ってみている(現在進行形)
目的
ロールバックネットコードという技術が、近年のゲーム業界、特に格闘ゲームの分野で流行っています。実際、国内外でも有名なAAA格闘ゲームタイトルにも採用され始めています。しかし、まだまだその具体的な情報やサンプルコードが少なく、初心者にとっては開発が難しいというのが現状です。
そこで、ロールバックネットコードを使用した格闘ゲームを作成することで、
- ロールバックネットコードを使った開発方法についてまとめる
- 技術としての良し悪しを評価する
- 格闘ゲーム以外の使い方を考察する
ということを目的としています。
ロールバックネットコードとは?
格闘ゲームなどのリアルタイム性が重要なオンラインゲームにおいて、プレイヤー同士の同期をとるための技術。
以前はディレイ方式(遅延が発生した場合、相手の入力情報が届くまでゲームを止まらせる同期方式)が主流でした。しかしディレイ方式の場合、プレイ中に遅延が少しでも発生すると、画面が止まる瞬間がどうしても出てきてしまいます。これは1フレームを争う格闘ゲームにおいて、プレイヤーにとって大変不便です。
その欠点を解消したのが、ロールバックネットコード(ロールバック方式)です。遅延発生時、相手側の直前の入力データを元に、以降のフレームを予想して実行します。もちろんこの予想が外れる時もあります。その際は遅れて到着した入力データを反映させ、正しい状態へと画面を描画し直します。こうすることで遅延による違和感が軽減されます。しかし、予想と実際の入力が大きく異なる場合、キャラクターが瞬間移動したような挙動が起こる、実際にはヒットしていないのにヒットしたように見えてしまう、などといった別の欠点もあります。
実際に制作してみる
ゲームエンジンの選定
そもそもロールバックネットコードを実装するライブラリがGGPOしかなかったので、GGPOを組み込みやすいゲームエンジンを探すところから始まりました。最初はUnityやUnreal Engineといった有名どころで作ろうとしましたが、GGPOをそのままの状態で使用することが難しく、GGPOと同様の機能を持つライブラリを自分で開発する必要がありました。一応GGPOをUnityやUnreal Engine用に書き換えたものもありましたが、うまくいかず断念しました。そして、最終的にはDXライブラリを採用することにしました。DXライブラリは大まかにはWin32APIやDirectXの薄いラッパーであるので、GGPOと相性が良かったからです。
設計
どのような構造のゲームでもGGPOを組み込めるというわけではなく、以下の条件を満たすようにプログラミングする必要がありました。
https://github.com/pond3r/ggpo/blob/master/doc/DeveloperGuide.ja.md
- ゲームのシミュレーションは完全に決定的でなければなりません。つまり、特定のゲームステートと入力があった時に、ゲームステートを1フレーム進めると全プレイヤーのゲームステートが同じにならなければいけません。
- ゲームステートが完全にカプセル化され、シリアライズが可能であること。
- ゲームエンジンはそのフレームのゲーム内容をレンダリングすることなく、復元、保存、フレームのシミュレーションができなくてはなりません。これはロールバックを実装するために使用されます。
かみ砕くと、1フレーム後のゲーム内容を計算するときは、現在のゲームステートと各入力データのみで求まるようにします。時間など外部的なパラメータを使ってはいけません。それと、ゲームステートとレンダリング工程を完全に分離しなければいけません。
実装
現在進行中です。
使用した外部ツール
- GGPO
- https://github.com/pond3r/ggpo
- ロールバックネットコードを実装するためのライブラリ
- オープンソース(MITライセンス)
- DXライブラリ
- https://dxlib.xsrv.jp/
- ゲームライブラリ
- 使用は自由(DXライブラリ内部で使用されているライブラリの著作権表示は必要)
- Mixamo
- https://www.mixamo.com/
- 3Dモデル・モーションをダウンロードできるサイト
- ロイヤリティフリーで個人、商用、非営利を問わず使用可能
まとめ
まだ制作途中なので確かなことはあまり言えませんが、現時点で分かっていることがいくつかあります。
まずロールバックネットコードを実装するライブラリはGGPOしか今のところありません。そして、そのGGPOの最後の更新が3年以上前とかなり時間が経っているため、今後の使用に不安が残ります。したがって、現状から好転しない限り、これからロールバックネットコードを実装しようとすると、ゲームエンジンとの相性問題などによって、外部のライブラリを使えない可能性があります。使用するゲームエンジンに合わせ、自分で開発する必要がある場合もあるということです。
そしてゲーム自体も、開発する際の制約がいくつかあります。そのため、ゲームエンジンを使用する場合はそれが条件を満たせるかどうかを事前に調べる必要があります。
このように開発コストが大幅に増えますので、実装を計画する際は慎重にならざるを得ないでしょう。
コメント