MetaHorizonWorldで、サムズアップジェスチャーするとエモートが出た。同じようなことを自分のプロジェクトでもやりたい。
コントローラー
Horizonはハンドトラッキング未対応だから、コントローラーでグリップとトリガー同時押しでサムズアップできる。それはCopilotに聞いてすぐできた
public class ControllerHandPoseReaction : MonoBehaviour
{
void Update()
{
// Oculusのコントローラーの入力を取得
bool isRightTriggerPressed = OVRInput.GetDown(OVRInput.RawButton.RIndexTrigger);
bool isRightGripPressed = OVRInput.Get(OVRInput.RawButton.RHandTrigger);
bool isLeftTriggerPressed = OVRInput.GetDown(OVRInput.RawButton.LIndexTrigger);
bool isLeftGripPressed = OVRInput.Get(OVRInput.RawButton.LHandTrigger);
// トリガーとグリップが同時に押されたとき
if (isRightTriggerPressed && isRightGripPressed)
{
}
if (isLeftTriggerPressed && isLeftGripPressed)
{
}
if (isLeftTriggerPressed && isLeftGripPressed && isRightTriggerPressed && isRightGripPressed)
{
//
}
}
}
ハンドトラッキング
せっかくなのでハンドトラッキングでもやりたい。
この記事見て、スクリプト書かなくても簡単にできそうなのでやってみた
公式ドキュメント
手とかはもろもろセットアップ済みなので書かない
OVRInteraction下のHandFeatureRight(とLeft)にFingerFeatureStateProviderをつける。
各指には以下の場所にある何かをセットする。これがなんなのか全然わからない
次にプロジェクトで、Create>Oculus>PoseDetection>shapeから指の形を指定するファイルを作る
ここでジェスチャーを登録
むずかしい
https://developer.oculus.com/documentation/unity/unity-isdk-hand-pose-detection/
そして適当なオブジェクトにShapeRecognizerActiveStateをつけて、Handと今まで触ったもろもろを登録
あとはジェスチャーイベントを検知してやりたいことをするだけ。
ActiveStateUnityEventWrapperを使えばかんたんにInspectorでイベント検知&イベントができる
これで無事できた
でも腕の向き決めてないからブーでも出る
公式サンプル
自分でやった後に気づいたけど、公式でサムズアップのプレハブ用意されてた
そういえば昔このサンプルシーン触ったな。poseexample
ドキュメントを見るとちゃんと手の方向も設定できる
TransformFearureStateを手に付ける。
これをThumbsUpPoseから参照して全部埋まるとうまく動いた!
ちゃんと下向きの時は反応しない。
ちなみにShapeReacognizerもいろいろ用意されている
ThumsUpの正解はこれなのか