読者です 読者をやめる 読者になる 読者になる

Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 VR空間で手を飛ばす方法について

UE Tips UEゲーム制作

この記事は裏Unreal Engine 4 (UE4) Advent Calendar 2016への参加6日目の記事です。

qiita.com

既にアドベントカレンダーの3度目の記事ですが、これでラストの予定です。

そして今日はOculus Touchの発売日です!


先日以下のイベントに参加してきました。

peatix.com

というわけで今回は、Oculus Rift CV1とOculus Touchを使ったゲームについてを解説します!

VR GameJamで制作したゲーム

VR GameJamは2日間でVRゲームを作るイベントです。そこで以下のVRゲームを制作しました。



とりあえずOculus Touchがあったら真っ先に作ってみたいゲームのひとつがVRでロケットパンチを飛ばすことでした。なかなか制作する時間が確保できなかったので、ちょうどいいタイミングでゲームジャムがあったのでここで制作することに。

Oculus Touchについては以下の記事でも少し触れています。

unrealengine.hatenablog.com


非常に直感的に操作ができるモーションデバイスなので、動かしているだけでも楽しいです。

今回のプロジェクトはVRテンプレートをベースにして制作しており、Oculus Touchを認識するだけですぐにゲームが作れました。

使用バージョンは最新のUE4.14なので、フォワードシェーディングとMSAAAが使えるために通常よりも高速に動作し、かつMSAAによりハッキリクッキリと見えるため、想像以上に美しいです。

VRテンプレートの処理

このゲームではTouchのトリガーボタンを押すことで腕を前方に飛ばすことができます。そして目の前に物理オブジェクトがあると、それらを吹っ飛ばしていきます。物理オブジェクトに当たっても基本的にはすぐに腕は戻ってきませんが、敵となるキャラクターに腕がヒットするとすぐに戻ってくるようになっています。

VRテンプレートには"MotionControllerPawn"と"BP_MotionController"というふたつの重要ブループリントが入っています。

f:id:alwei:20161202235813p:plain

"MotionControllerPawn"は自分自身の位置を持つ本体のブループリントです。"BP_MotionController"はTouchの動きを制御する腕そのもののブループリントです。

"MotionControllerPawn"はBeginPlay時に左手用と右手用の"BP_MotionController"を作成します。

f:id:alwei:20161203001129p:plain


スポーンをしてすぐにアタッチしているので腕の位置が固定されます。内部で行っている処理は全く同じで、左手用の場合にはZ軸のスケールを-1とすることで向きを反転させています。基本的にこれらのブループリントはほぼそのまま使っています。

VR空間で手を飛ばす試行錯誤

ゲームジャムが開始し、しばらくは試行錯誤が続きました。1日目の夕方にはまだ何も形になっておらず、少し焦りもありました。

まずは"BP_MotionController"に"Projectile Movement"コンポーネントを追加し、手をそのまま飛ばしてみました。しかしこれは手のトラッキングが効いた状態で飛ぶことになるので、予想以上に違和感がありました。例えば手が開いた状態ロケットパンチが空中を飛んでいっても違和感があるわけです。

ここで作戦を変更。"BP_MotionController"とは別の手を飛ばすためのブループリントを作成。

f:id:alwei:20161204003512p:plain

通称"RocketHand"。このブループリントでは手のトラッキングなど一切行わず、ProjectileMovementの機能を使って真っ直ぐ飛ぶだけです。ProjectileMovementにはホーミング機能があり、対象アクターのコンポーネント情報があればそこへ向かって追尾させることが可能です。

ホーミングについては以下を参考に。
unrealbussan.hatenablog.com

f:id:alwei:20161204004343p:plain

"MultiSphereTrace"を利用し、前方にいる敵がいればその対象をロックオンアクターとして認識するようにしています。目の前に対象がいない場合はロックを外します。

f:id:alwei:20161204004652p:plain


f:id:alwei:20161204004747p:plain

これで自分が対象をロックした際にはロケットパンチが自動で追尾します。実際の判断にはタグを用いて特定種類のアクターのみにフィルターをしています。今回は間に合いませんでしたが、ロックオン時には何かしら演出を加えた方がより効果的だと思います。

ロケットパンチが発射した瞬間に、BP_MotionController側の手のメッシュは一時的に非表示にしておきます。

手を飛ばした後に戻す

ロケットパンチなので、当然飛ばした後は元に戻ってきます。戻す条件は"1秒経過する"、もしくは"敵にパンチがヒットする"かのどちらかです。

RocketHandがスポーンされて、Delayノードで1秒待った後に、飛ばした腕が右手か左手かを判断して、元の位置へとProjectileMovementのホーミング機能を使って戻すようにします。

f:id:alwei:20161204010420p:plain

ホーミング機能を使って高速に手が元に位置に戻ってきますが、ここで専用のコリジョンを用意して、そのコリジョンにオーバーラップ時にRocketHandを消す処理を行います。

f:id:alwei:20161204011703p:plain

RocketHandはすぐに消すわけではなく、一旦手のスケルタルメッシュを非表示にしておくのみにしておき、エフェクトの処理待ちを行ってから消しています。

f:id:alwei:20161204011945p:plain

BP_MotionController側でも非表示だった手のスケルタルメッシュを戻します。この時に戻ってきたSEの再生を行うようにしています。

コリジョンヒット後は敵を吹っ飛ばす

もちろんロケットパンチがヒットしたら敵を吹っ飛ばさなくてはなりません。これはRocketHand側では判定せずにエネミー側のブループリントで処理しています。

f:id:alwei:20161204012649p:plain

エネミーのコリジョンにヒットした際にエネミーのスケルタルメッシュで"Set Simulate Physics"をオンにしてやることにより、ラグドールのような動作になります。またその瞬間に"Add Radial Force"で力を発生させることにより、いい感じに敵を吹っ飛ばしています。

f:id:alwei:20161204013132p:plain

敵を面白く吹っ飛ばそうと思ったら物理アセットの調整が必須です。元々モデルで物理アセットがいい感じセットアップされている場合はいいですが、オリジナルで作ったモデルの場合は必ず物理アセットの調整をやらないと本当に酷い動きになるので注意しましょう。

VR空間でのエフェクトとSEの存在感

今回のVRゲームを作っていて特にその存在感があったのは、ロケットパンチを飛ばした際に発生する煙エフェクトと戻ってくる際に発生する『ガチャーン!』という着弾音です。

f:id:alwei:20161204013840p:plain

特に煙エフェクトは今回用に作成し、最初は火もでていたのですが、VR空間ではあまりに邪魔だったので消してしまいました。

f:id:alwei:20161204014038p:plain

発射直後から煙エフェクトを発生させると、目の前に煙が広がって邪魔だったので、手を飛ばしてから1フレーム遅らせるなどの処理を加えています。また戻ってくる時も目の前にいつまでも残っていると非常に邪魔なので、1秒後には消しています。

エフェクトを加えた後にSEも加えて、いざVR空間で試してみるとこれが本当に気持ちよくて、作った自分で『うわ、やばいこれ気持ちいい!』と自画自賛でした(笑)

VRでのプレゼンスとしてこういう細かい部分の取り組みは非常に重要です。これらのポイントだけで体験自体が大きく変わってきますので。

最適化は…

今回最適化はしていません!(バッサリ)

実際これをGeforce GTX970上で動作させていますが、今のところ処理落ちらしいところは見受けられません。ナビゲーションメッシュの動的アップデートもやっているのでそこそこ重いはずですが、なんとかなっています。

今回は4.14の新機能であるフォワードシェーディングのおかげで結構速くなっているのかなと感じています。そしてMSAAによるクッキリさのおかげでかなり綺麗に見えます。正直この見た目で最適化なしで処理落ちなしというのはかなりすごい。

UE4の標準レベルの最適化もかなり効いてきており新バージョンになればなるほどVR開発が楽になってきていると感じます。

VR空間で手を飛ばすと…

結論としてVR空間で手を飛ばすというのは本当に気持ちいい!!

実際やってみるとわかりますが、本当に手が飛んでいっているような気持ちになります。そしてそれに当たったオブジェクトや敵が吹っ飛ぶのも気持ちいい!これはぜひ一度体験してもらいたい楽しさです。

このロケットパンチVRゲームはOculus Previewアプリとして公開しています。Oculus Touchが発売した今こそぜひ遊んでください!!

明日はMozPacaさんによる『Procedural Midiをちょこっと分析して使ってみる』です。気になっている機能なので楽しみ。