たこやき部屋

SteamVRを使って、Unityでゲームを開発したい

【VR】床がないなら落下すべき

Unity:2019.4.9f1
SteamVR Plugin:2.6.1 (sdk 1.13.10)

を使用して、手探りで作っています。

Walkable.csを修正しました(2020/09/12)



前回作ったテレポートの続きです。

takoyakiroom.hatenablog.com

テレポートを試していると、床がないところに移動しても下に落ちない事に気が付きます。
f:id:takoyakiroom:20200909093050g:plain
おそるおそる床のないところに移動してみるけど、落ちない。

なので、今回は「床がないところに行ったら下に落ちる」ようにしてみます。

手の震えを止める

でもその前に、テレポート移動できるようにしておくと、実行後にヒントの表示とともにコントローラが震えてウザいので、まずはこれを止めます。
f:id:takoyakiroom:20200909094251j:plain
この時、コントローラがぶるぶるしまくり。テレポートしないと手の震えが止まらない!

「Player」→「SteamVRObjects」→「Player」→「LeftHand」にある「ControllerButtonHints」がそれっぽいので、非アクティブにしたら手の震えが止まりました。

これ
f:id:takoyakiroom:20200909095008j:plain

OFFにする
f:id:takoyakiroom:20200909095221j:plain

「Player」の内部を調査

適当に触ってみた感じでは簡単に落下できなさそうなので、「Player」の中身をみて構造を探ります。

VRヘッドセットはどれ?
「Player」→「SteamVRObjects」→「VRCamera」っぽい。
子に「FollowHead」、孫に「HeadCollider」があります。

・プレイヤーの身体はどれ?
「Player」→「SteamVRObjects」→「BodyCollider」がプレイヤーの身体っぽいけど、ヘッドセットの位置とはズレています。
ちなみにCapsuleColliderで、下の図の緑のやつです。
f:id:takoyakiroom:20200909103005j:plain

・プレイエリアはどれ?
「Player」がプレイエリアの中心位置みたいです。

これを踏まえると、床がないところで下に落ちれるようするには、こうしたら良いのかな?

  1. 「BodyCollider」をVRヘッドセットと同じ位置(X,Z座標)に移動するようにする。また、重力の影響を受けるようにする(床から落ちたら下に落ちるようにする)
  2. 「BodyCollider」の高さに合わせて「Player」の高さ(Y座標)を変える。

BodyColliderを直す

「BodyCollider」にはスクリプトがアタッチされていますが、非アクティブです。
で、中を見るといまいち使い勝手が悪そう。というかサンプル程度のコードしか書かれていなかったので、このコードを書き換えて「BodyCollider」がVRヘッドセットと同じ位置に移動するようにします。

インスペクターからスクリプトの「Head」に「VRCamera」を指定して実行。
VRヘッドセットに合わせて「BodyCollider」が動くようになりました。
f:id:takoyakiroom:20200909092949g:plain

「BodyCollider」にアタッチされている「Rigidbody」の設定を変えて、重力で落ちるようにします。
また、Colliderが転がらないよう「FreezeRotation」にチェック。
f:id:takoyakiroom:20200909162638j:plain

頭・手と身体が干渉する

「BodyCollider」を有効にしたことで、頭や手のColliderと干渉するようになりました。
なので、干渉しないよう設定です。

インスペクターから「Player」の「Layer」に、新しく「Player」のレイヤーを作り、割り当て。
f:id:takoyakiroom:20200909164319j:plain

「Player」の子オブジェクトも全部レイヤーを変えるかを聞かれるので、全部変える。
f:id:takoyakiroom:20200909164322j:plain

メインメニューから「Edit」→「ProjectSettings」→「Physics」を選んで、「LayerCollisionMatrix」の「Player」x「Player」のチェックを外す。
f:id:takoyakiroom:20200909170948j:plain

これで干渉しなくなったー!

Playerの高さを変える

「Player」に新しいスクリプト「Walkable」を追加して、「BodyCollider」に高さを合わせるようにします。
また、初期位置をVRヘッドセットのある位置にずらしときます。

作ったスクリプトの「Head」に「VRCamera」、「BodyCollider」に例の「BodyCollider」を設定。
f:id:takoyakiroom:20200909171235j:plain

高いところから足を踏み外してみたところ、無事に落下できました。
f:id:takoyakiroom:20200909171457g:plain



パソコンとゲームのケーブル多すぎなの、これでまとめてます。自作機部屋の動画で使っている人がいて知った。