【VR】床がないなら落下すべき
Unity:2019.4.9f1
SteamVR Plugin:2.6.1 (sdk 1.13.10)
を使用して、手探りで作っています。
Walkable.csを修正しました(2020/09/12)
前回作ったテレポートの続きです。
テレポートを試していると、床がないところに移動しても下に落ちない事に気が付きます。
おそるおそる床のないところに移動してみるけど、落ちない。
なので、今回は「床がないところに行ったら下に落ちる」ようにしてみます。
手の震えを止める
でもその前に、テレポート移動できるようにしておくと、実行後にヒントの表示とともにコントローラが震えてウザいので、まずはこれを止めます。
この時、コントローラがぶるぶるしまくり。テレポートしないと手の震えが止まらない!
「Player」→「SteamVRObjects」→「Player」→「LeftHand」にある「ControllerButtonHints」がそれっぽいので、非アクティブにしたら手の震えが止まりました。
これ
OFFにする
「Player」の内部を調査
適当に触ってみた感じでは簡単に落下できなさそうなので、「Player」の中身をみて構造を探ります。
・VRヘッドセットはどれ?
「Player」→「SteamVRObjects」→「VRCamera」っぽい。
子に「FollowHead」、孫に「HeadCollider」があります。
・プレイヤーの身体はどれ?
「Player」→「SteamVRObjects」→「BodyCollider」がプレイヤーの身体っぽいけど、ヘッドセットの位置とはズレています。
ちなみにCapsuleColliderで、下の図の緑のやつです。
・プレイエリアはどれ?
「Player」がプレイエリアの中心位置みたいです。
これを踏まえると、床がないところで下に落ちれるようするには、こうしたら良いのかな?
- 「BodyCollider」をVRヘッドセットと同じ位置(X,Z座標)に移動するようにする。また、重力の影響を受けるようにする(床から落ちたら下に落ちるようにする)
- 「BodyCollider」の高さに合わせて「Player」の高さ(Y座標)を変える。
BodyColliderを直す
「BodyCollider」にはスクリプトがアタッチされていますが、非アクティブです。
で、中を見るといまいち使い勝手が悪そう。というかサンプル程度のコードしか書かれていなかったので、このコードを書き換えて「BodyCollider」がVRヘッドセットと同じ位置に移動するようにします。
インスペクターからスクリプトの「Head」に「VRCamera」を指定して実行。
VRヘッドセットに合わせて「BodyCollider」が動くようになりました。
「BodyCollider」にアタッチされている「Rigidbody」の設定を変えて、重力で落ちるようにします。
また、Colliderが転がらないよう「FreezeRotation」にチェック。
頭・手と身体が干渉する
「BodyCollider」を有効にしたことで、頭や手のColliderと干渉するようになりました。
なので、干渉しないよう設定です。
インスペクターから「Player」の「Layer」に、新しく「Player」のレイヤーを作り、割り当て。
「Player」の子オブジェクトも全部レイヤーを変えるかを聞かれるので、全部変える。
メインメニューから「Edit」→「ProjectSettings」→「Physics」を選んで、「LayerCollisionMatrix」の「Player」x「Player」のチェックを外す。
これで干渉しなくなったー!
Playerの高さを変える
「Player」に新しいスクリプト「Walkable」を追加して、「BodyCollider」に高さを合わせるようにします。
また、初期位置をVRヘッドセットのある位置にずらしときます。
作ったスクリプトの「Head」に「VRCamera」、「BodyCollider」に例の「BodyCollider」を設定。
高いところから足を踏み外してみたところ、無事に落下できました。
パソコンとゲームのケーブル多すぎなの、これでまとめてます。
サンワサプライ ケーブル配線トレー ワイヤー Sサイズ 汎用タイプ CB-CT4
- メディア: オフィス用品