Introduction
前回の記事 で作ったサンプルを改造して、レイでヒットしたキューブを掴む処理を追加してみる。
対象は
- Unity
- 2021.3.5f1
- Oculus Integration
- 41.0
サンプルソースは、GitHub に置きました。
How to implement?
調べると
- OVRGrabber
- OVRGrabbable
ってのを使えばいいらしいが、よくわからんので 0 から実装する。
参考にさせていただいたのは下記。
ただし、この記事は
- Oculus Go をターゲットにし、Go のコントローラ特性を利用してオブジェクトを操作している
- 放り投げる動作をサポート
している。
今回はシンプルに
- オブジェクトをレイの挙動に従って動かすこと
- 慣性とか重力加速度は考えない
- オブジェクトは浮いているものとする
という条件で実装する。
キューブ
まずは動かす物体としてキューブを追加する。
Inspector をみると下記の属性・コンポーネントが存在する。
- Transform
- ゲームオブジェクトの位置・回転・スケール(拡大・縮小)を制御
- Mesh Filter
- メッシュを参照する。メッシュレンダラーは、メッシュフィルターが参照するメッシュをレンダリングする、らしいがよくわからない
- Mesh Renderer
- メッシュのレンダリング。そのまま?
- Box Collider
- 立方体をした基本的なコライダー
- Collider コンポーネントは、物理衝突のためのオブジェクト形状を定義するもの。要するに衝突や接触判定をサポートするという理解
- Transform と同じように、X、Y、Z があるから、コライダーの範囲と表示上のサイズを別にできるきがする
- Collider コンポーネントは、物理衝突のためのオブジェクト形状を定義するもの。要するに衝突や接触判定をサポートするという理解
- 立方体をした基本的なコライダー
なので、このコライダーを意識しながら、「掴まれる」機能を追加していく。
はずだが、今回は意識しなくてもいい。
コライダーを無効にしたり、スケールを変更しない限りにおいてだが。
コライダーを無効にすると、後述の Physics.Raycast
でヒットしなくなるので。
あと、色を付けた。
Materials フォルダを作成し、Material を追加。
Albedo を赤に変更後、Cube にドラッグアンドドロップで完成。
レイで掴む
レイを制御するスクリプト LaserPointerBehavior を改造する。
1 | using UnityEngine; |
- RayCast でレイがコライダーにヒットしたかどうかを調べる
- ヒットしたコライダーを持つゲームオブジェクトを取得
- トリガーがオンかどうか調べる
1 . 直前のフレームのコントローラの座標と現フレームのコントローラの差を移動ベクトルとして計算- ゲームオブジェクトに移動ベクトルを加算
- トリガーがオフかどうか調べる
- 掴んでいるゲームオブジェクトの情報を破棄
特にコントローラの位置を使って移動量を計算することで、奥行方向にもキューブを動かせるようになります。
最初は hitInfo.point
を使っていたのですが、これだとゲームオブジェクトの表面の座標になるので、前後のフレームを比べた時に奥行方向がとれないので没になりました。
_Responsiveness
はキューブを移動する際の応答性。
値を大きくすると、コントローラの動きに対してキューブが大きく移動します。
Result
Build して実行すると、コントローラーとレーザーが表示されるようになった。
Source Code
https://github.com/takuya-takeuchi/Demo/tree/master/Unity/Oculus/02_GrabCube