airmonkey_sge
WORKS

マルチプレイ対応のVRワイヤーアクションゲームのモック開発事例

,

こんにちは。サイバーエージェント2017年度入社 エンジニアの中地です。
今回は、サイバーエージェントグループのVR関連事業を行う子会社VR Agentで内定者アルバイトをしていた時に携わったワイヤーアクションゲームについて紹介します!

ハンドコントローラを用いた手のプレゼンスを活かした移動方法の確立や、Photon Unity Networkingを用いたリアルタイムマルチバトルの実装などについてお話します。なお本タイトルは2017年5月8(月)・9日(火)に開催される「Unite 2017 Tokyo」で展示予定ですので、ご興味のある方はぜひブースにお立ち寄りください。

ゲーム概要

今回開発したゲームは、手を伸ばしてビルや飛行物体を掴み、ダイナミックに進んでいくレースゲームです。VRではまだ数の少ない対戦型のマルチプレイも実装しています。

image2_1200_630

爽快感のあるワイヤーアクション

今回のコンテンツではハンドコントローラー(※1)を用いたワイヤーアクションを実現しました。アクション部分はUnityの物理エンジンを元に実装し、現実らしい動きと気持ちのいいワイヤー操作を両立させました。
HandController

(※1) 両手に持つコントローラ。位置や回転状態、ボタンの押下状態などをUnity上で知ることができます。本ゲームは、この情報をVR空間内の手に反映しています。

プレイヤーにかかる力には以下の3つがあります。

  • 重力
  • 空気抵抗
  • ワイヤーを引く力

今回はこれらの力をスクリプト内で計算し、FixedUpdate内でAddForce()するという方法をとりました。こうすることでパラメータの調整が容易になり、また衝突判定などの計算をエンジン側に任せることができました。

ワイヤーの引く力にはフックの法則の式を利用しています。これは、ばねの長さをx[m]、弾性力の大きさをF[N]とすると、F=k*xで表せます。つまり、ワイヤーの着地点の距離が遠いほどより強い力をプレイヤーにかけることができます。重力との合成ベクトルがy軸方向に下がりすぎないように調整を行いました。

また、気持ちの良い動きには空気抵抗が非常に重要でした。空気抵抗は物体の速さに比例して増加する力と近似できます。ワイヤーで高速に移動をするとその方向に強い慣性が働きますが、空気抵抗の比例定数を大きめに設定することで、より直近の力を重視する物理計算をすることができます。これにより、ワイヤーをつかって自在に空中を移動できるアクションを実現することができました。

ワイヤーアクションとVR酔い

一般にVR空間でポジショントラッキング(※2)以外のカメラ移動をすることは酔いに直結すると言われています。しかしいくつかのVRコンテンツを体験したり自分たちで移動を試してみたところ、ワイヤーアクションでの移動自体では必ずしも酔わないことに気がつきました。

酔いは予測性と強い関連があるため、移動時には等速運動が良いとされています。しかし、等速運動ではあっても地面を並行移動する動きは現実の歩行の動きとは異なるため酔いが発生してしまう場合もあります。

ワイヤーアクションは加速する運動にもかかわらずなぜ酔いにくいかを考えたところ、想像と現実感のバランスが取れていることに起因するのではないかと仮説が立ちました。つまり、マンガや映画などである程度イメージがあり、かつ現実ではできない動きであるために予測の精度が高くないことが良い方向に働いているのではないか、ということです。

ただし、壁にぶつかると予測しづらいタイミングで運動が大きく変化するので酔いが発生したり、認識できないほどの速さで移動をした場合には周辺視野に強い刺激が与えられベクション(※3)が発生することはありました。これについては今後の対策が必要になってくると考えています。

(※2) 頭の位置(VR用ヘッドマウントディスプレイの位置)をリアルタイムに取得する仕組み。

(※3) 視覚誘導性自己運動感覚。視覚によって(実際には静止しているのに)自分が動いていると感じる現象。よく知られる事例としては、乗っている電車が停まっている状態で隣の電車が動くのを見た際の感覚がある。

プレイヤーの物理挙動

今回のゲームではすべての座標操作をUnityの物理エンジンを用いて行いました。

プレイヤーはRigidbodyを持ち、ワイヤーアクションによる移動はプレイヤーに対するAddForce()を行い、またプレイヤーがもつColliderによって他のオブジェクトと衝突した場合には影響を受けるようにしています。

通常の1人称の3Dアクションゲームであればこれだけで問題ないのですが、VRゲームの場合はカメラの問題が発生します。

Unityではヘッドトラッキング(※4)の結果がカメラの座標に上書きされるため、ヘッドトラッキング以外でカメラを操作する場合は、カメラの親オブジェクトに対して操作を行う必要があります。そのため、Rigidbodyなどの物理挙動に関連するコンポーネントはカメラの親にアタッチする形になります。

CameraのTransformは、ヘッドトラッキングした姿勢でオーバーライドされます。カメラを動かしたり回転させたりするには、他のゲームオブジェクトの子としてアタッチします。そのため、カメラがアタッチした親のTransformが変化すると、カメラにも影響します。このことは、スクリプトを使ってカメラを動かしたり回転させる場合でも同じです。

引用元:Unity – マニュアル: VR 概要

この状況では、カメラの相対座標はポジショントラッキングによって決定するため、実際にプレイヤーがいる位置とカメラの視点がずれてしまう問題が発生します。ゲームによってはそれで問題ないですが、今回のような頻繁に動き回るコンテンツではプレイヤーの視点とカメラの視点を同期する必要がありました。対策として、ポジショントラッキングの基準座標(通常はトラッキングエリアの中心)からの相対座標を、プレイヤーのColliderのオフセット座標に反映させました。Capsule ColliderやSphere Colliderの場合はcenterがオフセット座標に当たります。

オフセット座標を利用することで、現在の物理挙動の状態(速度や加速度、角速度など)に影響を与えることなくシームレスにプレイヤーの頭の位置とカメラ座標を同期することができました。プレイヤーの座標を直接操作する方法でも実現は可能ですが、物理挙動のライフサイクルに注意する必要があるかもしれません。

参考URL: Unity – マニュアル: イベント関数の実行順

(※4) 頭の回転(VR用ヘッドマウントディスプレイの回転)をリアルタイムに取得する仕組み。

Photon Unity Networkingを用いたリアルタイムマルチバトル

今回の開発ではPhoton CloudのPhoton Unity Networking(PUN)を採用しました。理由としてはクラウドサービスであるため導入が容易であり、多くのサービスで利用されているために信頼性が高いことが挙げられます。

PUNではPhotonViewというコンポーネントを介して登録したコンポーネントの同期を行います(別途ロビー(※5)やルーム(※6)への入室は必要です)。また、PUN側で提供されているPhotonTransformViewやPhotonRigidbodyViewを用いることで座標の補完処理が入り、通信先でも滑らかな移動を実現することが可能です。

(※5) マルチプレイゲームにおいて、プレイヤー同士がマッチングされる前に接続している仮想的な集合場所。

(※6) マルチプレイゲームにおいて、ゲーム状態を共有するプレイヤーが集まってプレイする仮想的な場所。例えばレースゲームであれば、1つのレースが1ルームとなる。

VRマルチプレイにおけるプレイヤーの同期

お互いの画面で共通の動きをさせたいものは、上記のPhotonViewなどをアタッチしたオブジェクトをシーン上に配置するだけで簡単に同期ができますが、マルチプレイ時のプレイヤーの場合は考慮する項目がいくつかあります。

まず、マルチプレイにおけるプレイヤーはそれぞれそのキャラクターを操作するユーザーがいます。しかし、同期対象のオブジェクトはそれぞれの画面で共通のため、そのまま同期した場合にはそれぞれのクライアントでの入力がそれぞれのキャラクターに適用されてしまいます。そのため、自分のクライアントで管理しているプレイヤーを識別し、そのプレイヤーにのみ入力を適用するという処理を追加する必要があります。

プレイヤーの識別にはPhotonView.isMineプロパティを使用します。

VRIKを組み合わせたキャラクターの表示

マルチプレイの場合は相手プレイヤーの表示をする必要があります。そこで今回は『Final IK』というアセット内のVRIK(※7)を用いてプレイヤーの姿勢をVR空間上で再現する手法を採用しました。VRIKは頭と両手(両足)のターゲットオブジェクトを指定するだけで現実空間のプレイヤーの姿勢をVR空間上でおおむね再現することが可能です。

今回はPhotonを用いて同期を行うため、ターゲットオブジェクトの座標のみを共有し、IKの計算はそれぞれのクライアント側で行いました。

(※7) Inverse Kinematics。空間上の身体パーツ(手、足、頭など)の位置から適切な姿勢や関節の状態を決定する技術。標準的なVR環境では頭(ヘッドマウントディスプレイ)と両手(ハンドコントローラ)の位置が取得できるので、その位置と身長(床からの高さ)の情報を使って3Dモデルのポーズを決めることができる。

さいごに

いかがだったでしょうか。

今回は、爽快感のあるワイヤーアクションを実現するためのポイントと、VRとの相性の良さについて、またプレイヤー自身が移動し続ける種類のVRアクションゲームのプレイヤーの実装や、マルチプレイ機能の概要についてご紹介しました。VRを用いた動きの激しいコンテンツや対戦型マルチプレイはまだまだ多くありませんので、参考になれば幸いです。

VR Agentでは、今後も技術的なチャレンジやコンテンツの企画、開発を行っていきます。

LINEで送る
Pocket

おすすめ記事