【Oculus Touch】UnityでFF15の武器召喚っぽいもの&シフトっぽいもの

Oculus CV1とTouchコントローラを入手しました。
せっかくなので何かTouchを活かしたものを作ろうと思い、最近プレイして面白かったFF15の武器召喚&シフトをUnityで雑に再現してみました。


www.youtube.com

FF15では、戦闘に入る際に何も無い所から武器を召喚して戦います。
また、武器を敵や壁に向かって投げつけ、刺さったところにワープするシフトというシステムがあり、これを活用して非常にスタイリッシュな攻撃が可能になっています。

Oculus Touchのコントローラを活かして、出現させた武器を「つかむ」ことが出来れば面白いはず!

vrinside.jp
武器のモデルはこちらを使用。
https://www.assetstore.unity3d.com/jp/#!/content/7056

●武器召喚

AvatarGrabSample (Avatar Grab sample available (Unity) — Oculus)を使い、モデルに掴める部分を付与。

▼まずは簡単に作ってみた。Touchの有名なデモゲームであるBullet trainのように、つかめばつかむだけ複製できる仕様

▼使用時のイメージはこんな感じ。

ここでしばらく間が空く。個人的には上記でおおむね満足してたのですが、友人から「手元に出てきたほうがFF15っぽい」と言われて確かにそうだと納得。
▼手を出したところに出現するように変更。


●シフト(ワープ)

次はシフトの実装。
シフトのアクションを分解し、《投げる》《刺さる》《ワープ》の3アクションとしました。
これを一つ一つ実装していきます。

《投げる》について。理想はゲームよろしく「掴んだ武器を目標にブン投げて刺す」
…なのですが、AvatarGrabSampleを使ってものを握ったとき、武器のような長物を投げたときの制御が非常に難しいことがわかりました。
思った通りの力で投げられないし、特に武器の回転はコントロールができません。
なにより、思いっきりブン投げるという動作は色々と危険です
なので、手の向いた方向に武器を飛ばすという代替案を実装しました。
▼武器射出

t.co

次は《刺さる》
これは壁Objectに壁tagを付与し、壁tagを持つオブジェクトと武器がぶつかった時に武器のiskinematicをfalseにするという形で実装しました。
刺さった武器は握って抜くことも可能です。
▼射出した武器を壁に刺す

t.co

そして《ワープ》
武器が刺さった場所をワープポイントとし、ボタンを押すと最後に刺さった武器の場所にCamera(avatar)のpositionを移動させています。
▼武器が刺さった場所にワープ

これで《投げる》《刺さる》《ワープ》のシフト3アクションが完成しました。
ただ、このままではワープ時の切り替わりが唐突なのでフェードイン・フェードアウトの効果を足します。
以下のコードを活用させていただき、実装。
Unityでフェードイン・アウトを簡潔に書いてみる - KazumaLab.

▼シフトによるアスレチック移動

t.co

以上でシフト(もどき)が完成しました!

●所見

Touchコントローラを使うことで簡単にVR内に手を入れることができました。
重心の安定したコントローラ形状や,掴んだ時の振動によって触覚が得られるため、これだけでVR内のインタラクション性が格段に増しています。

VRの移動方法としての観点で見ると、シフトによるワープはBullet trainなどで採用されているテレポート方式と全く同じです。
移動先の場所や状態が想像しやすいことから、比較的酔いづらい手法となっています。
ただ、そのしるべになるものが武器ということを活かせば、FF15のように武器を投げてシフトしてからの連続攻撃…といったアクションが可能になるので、
単なるテレポートとは違った体験を与えることができると思います。

●参考記事

framesynthesis.jp
Touchを使用するための基本操作が掲載されています。
tuti107.hatenablog.com
Touchで「ものをつかむ」サンプルであるAvatarGrabSampleの使い方を教えていただきました。
tips.hecomi.com
avatarの設定がややこしいので、その設定方法がわかりやすく解説されています。