Nuitrack 1.5.0
3D スケルトン トラッキング ミドルウェア
|
このチュートリアルでは、Oculus Rift と Nuitrack を使用したプロジェクトの作成方法を紹介します。"Zombie Nightmare"という VR ゲームを作成します。プレイヤーの目標は、あちこちからランダムに出現するゾンビをすべて殺すことです。プレイヤーの命 (生き返れる回数) は無限ではありません。プレイヤーがゾンビに噛まれると、プレイヤーの健康状態がわずかに悪化し、最終的には死にます。一見平凡なプロジェクトの何が魅力的なのでしょうか?それは、プレイヤーがゾンビを破壊するのに手ではなく、足を使うということです。Oculus Rift プレイ時に、足を使ったことはあるでしょうか?ほとんどの人はないはずです!この足を使うという夢が、Nuitrack によってかなうのです!
プロジェクトに必要なものは多くはありません。
ハードウェア:
ソフトウェア:
完成済みプロジェクトは、 Nuitrack SDK: Unity 3D > NuitrackSDK.unitypackage > Tutorials > Zombie Nightmare (RIFT) です。
"City"のシーンを開きます (Nuitrack SDK > Tutorials > Zombie Nightmare (RIFT) > City)。ゾンビによる大惨事は、発展した大都市で起きるかもしれません。どこで発生するかは誰にもわかりません....
Unity の設定で、VR サポートを有効にします (Build Settings > Player Settings > XR Settings > Virtual Reality Supported)。
OVRCameraRig プレハブをシーンにドラッグ アンド ドロップします(Assets > Oculus > VR > Prefabs)。これがプレイヤーの頭になります。Position/Rotation/Scale を (0, 0, 0) に設定すると、プレイヤーをシーンの真ん中に立たせることができます ( このゲームの主役でありヒーローなので真ん中に)。Tracking Origin Type の設定を、OVRCameraRig プレハブの設定で行います。カメラがプレイヤーの高さに位置するように、OVRManager > Tracking > Tracking Origin Type > Floor Level で設定を行います。
NuitrackScripts プレハブをシーンにドラッグ アンド ドロップします (Nuitrack SDK > Nuitrack > Prefabs)。スケルトン トラッキングに必要なモジュールとして、[Skeleton Tracker Module On」、[User Tracker Module On]チェックボックスをオンにします。
必要なフィールドを追加します。「オフセット」とは、Oculus Rift (頭) と Nuitrack (その他のスケルトン関節) からのデータに基づいて計算したスケルトンのオフセットです。
Update で、ユーザーのスケルトンが検出された場合に処理を行います。
ProcessSkeleton で、オフセットを考慮して、左足と右足の位置を計算します (詳細については、「スケルトンを使用してアバターに生気を」チュートリアルをご覧ください)。トラッキング時に Unity の床のレベルより下に足がある場合 (ユーザーが座っている場合など)、位置が自動的に修正され、ユーザーの足が地下にあるということにはなりません。
スケルトン全体のオフセットを計算します。Nuitrack によって検出される頭の関節が、Oculus Rift によって検出される頭の位置からひいて計算されます。
FixedUpdate で、ユーザーの足の座標を適用します。Update ではなく FixedUpdate を使用するのは、Unity 物理特性がこのメソッドでしか処理されないからです。
プレハブ設定で次のフィールドを設定します。
Head - CenterEyeAnchor (OVRCameraRig プレハブから)
LeftLeg - leg Left (階層から)
RightLeg - leg Right (階層から)
Floor - FLOOR (階層から)
プロジェクトを実行します。素敵な青いスニーカーを履いた足が表示されます。動きは Nuitrack によってトラッキングされます。ユーザー セグメントを含む「画面 (平面)」が表示され、FPS の確認を行い、ユーザーの足がフレーム内に収まっているかを把握する助けとなります。
必要なフィールドとして、生成するゾンビの最大数、敵に関する配列、ゾンビの生成ポイントに関する配列、プレイヤー死亡後の再開時間、生成したゾンビの数カウンターを追加します。
Start では、常に繰り返されるSpawnEnemy メソッドの生成を、開始から 3秒経過後から、0.2秒毎に定義します。生成されるゾンビの最大数に達した場合、メソッドは実行されなくなります。再生前に、各ゾンビのサイズが微調整されます (すべて同じサイズにならないように)。
GameOver メソッドは、一定時間経過後にゲームを新しいレベルで再開するRestart メソッドの実行を開始します。
GameManager オブジェクトの設定の[敵]フィールドをゾンビで埋めます。そのために、Tutorials > Zombie Nightmare (RIFT) >Prefabs (Parasite, Hulk, Zombie Police) を使用します。
ゾンビの生成ポイントも設定します。設定には、Spawn Points > SpawnPoint(1)(Transform)、 SpawnPoint(2)(Transform) (階層から) を使用します。
必要なフィールド、健康状態のスコアとステータスバーを追加します。
GetDamage メソッドでは、ゾンビがプレイヤーに与えるダメージを設定します。プレイヤーの命が残り 0 の場合、remaining コードは実行されません。プレイヤーがゾンビにかまれると、健康状態が悪化 (健康状態のステータスバーが赤くなる)か死亡します。プレイヤーの死亡後 (Death メソッド)、レベルは 3秒後に再開します。
スクリプトを localAvatar - base にドラッグ アンド ドロップし、[Canvas]から healthbar を追加します。
[base]を選択し、[Capsule Collider] と[Rigidbody] を追加し、[Is Kinematic]チェックボックスをオンにすると capsule が落ちません。設定を次のスクリーンショットに示されている通りに設定すると、ゾンビがプレイヤーを取り囲みます。
必要なフィールドを追加します。
Awake メソッドでは、ゾンビの localPosition と modelTransform を取得し、ゾンビの子オブジェクト開始位置の局所座標を保存することで、ラグドールが完了した際に、この子オブジェクトが元の位置に戻れるようにラグドール化されます。
Start で、Ragdoll 処理で後で必要になる、ゾンビの体のパーツのRigidbody と Colliders と、ゾンビの胴体の Rigidbody のレファレンスを取得します。Ragdoll を無効にし、ゾンビのターゲットとなるプレイヤーを指定します。
switchRagdoll メソッドのゾンビ Ragdoll 切り替えを処理します。Ragdoll が有効になるのは、プレイヤーがゾンビを蹴り、ゾンビが鳥のように空を飛んでいくときです。Ragdoll を使用することで、ただ空を歩いているように去っているのではなく、本当に飛んでいきます。Ragdoll は、ゾンビが地面に着地後、約2秒間地面に倒れている場合に無効になります。
IsOnGround メソッドでは、ゾンビが地面に立っているかどうかを確認します。それぞれのゾンビにある FloorChecker オブジェクトにより、ゾンビの位置を確認できます。このオブジェクトは常に下を向いており、床の位置を確認するためのレイを発射するポイントとして使用することができます。レイを作成して、設定を行います。
Update で、ゾンビが攻撃できる時と攻撃を始める時を定義します。また、ゾンビの状況 (地面を歩いている、飛ばされて倒れている、空中) に応じた行動パターンも定義します。幸い、ゾンビはプレイヤーに蹴り飛ばされた後にのみ空中を飛べます。
IEnumerator Attacking で、1秒待ってから攻撃します (ゾンビは1秒毎に噛みついてきます)。
GetDamage メソッドでは、プレイヤーに踏みつけられた、また飛ばされたことによるダメージを定義します。
Death メソッドでは、ゾンビの死亡後の動作を定義します。それぞれのゾンビは、SkinnedMeshRenderers を含む配列 (様式の表示に使用) を持っています。配列要素のループ処理を行い、胴体の色を赤で塗りつぶします。Ragdoll オンにします、そうすると、ゾンビが死ぬと倒れるようになります。ゾンビを 5秒後に破壊します。
OnCollisionEnter メソッドで、プレイヤーがゾンビを足で踏みつけたときのゾンビへのダメージを定義します (プレイヤーには、スニーカーの裏に「Player」としてタグ付けされているコライダーがあり、これを使ってゾンビを踏みつけます)。
[プレハブ]フォルダーからHulk, Zombie Police, Parasite の各プレハブを選択し、要素を追加します (Add Component > Zombie Controller)。
Unity で、ZombieController(Script) オブジェクトをセットアップします。Floor Checker を Floor Checker に、Animator を Animator に、ゾンビの子オブジェクトを Model Transform に追加します。それぞれのゾンビには、子オブジェクトが1つだけです。ゾンビ プレハブをシーンにドラッグ アンド ドロップし、[適用]をクリックすると、設定が有効になります。ゾンビからのダメージを、速度や命 (生き返れる回数) を設定することができます。
このプロジェクトを強力な基盤として、さらに洗練されたゲームを Oculus Rift と Nuitrack Skeleton Tracking ミドルウェアを使用して作成できます。お楽しみください!