[Unity][LeapMotion] 付属のジェスチャーを試してみる
LeapMotionのAPIを用いてあらかじめ用意されているジェスチャーを行ってみたいと思います。
シーンの作成から実際にジェスチャーを検知するまでの手順をメモ書き程度にまとめました。
前提条件
LeapMotionSDKがUnity上で動くことが前提です。
上記を満たしていない場合、こちらにセットアップ手順を記しておりますのでご参照ください。
オブジェクトの配置
空のGameObjectを作成し、そこにHandControllerスクリプトをアタッチします。
手を表示したい場合はHandGraphicsModelにハンドモデルとなるプレハブを指定します。
ハンドモデルはAssets/LeapMotion/Prefabs/配下にあるHandModelsHumanとHandModelNohuman配下に格納されています。
例ではロボットの手の一種であるGlowRobotLeftHandを指定しました。
これで実際にゲームを起動すると、手が表示されます。
・・・と思いきや、手があまりにも小さく表示されたり表示されなかったりするかもしれません。
これはカメラの位置関係しています。
ここは自力で調整してやっとのこと表示されるようにする必要があります。
カメラワークの調整の末、何とか表示されるようになりました。
スクリプトの実装
オブジェクトの配置が出来たら次はジェスチャーを検知するスクリプトを作成します。
SDKではあらかじめ以下の4種類のジェスチャー検知が用意されています。
・円を描く
・キーをタップする(下に指を素早く振る)
・スクリーンをタップする(前に指を素早く振る)
・スワイプする
上記4種類を検知して結果を表示するスクリプトは以下のようになります。
using UnityEngine; using System.Collections; using Leap; using UnityEngine.UI; public class HandGesture : MonoBehaviour { public Text label; // 表示用ラベル private Controller controller = new Controller(); // ジェスチャー検知に必要 void Start() { // ジェスチャー有効化 controller.EnableGesture(Gesture.GestureType.TYPECIRCLE); controller.EnableGesture(Gesture.GestureType.TYPEKEYTAP); controller.EnableGesture(Gesture.GestureType.TYPESCREENTAP); controller.EnableGesture(Gesture.GestureType.TYPE_SWIPE); } void Update() { var frame = controller.Frame(); var fingerCount = frame.Fingers.Count; var gestures = frame.Gestures(); var interactionBox = frame.InteractionBox; if ( frame.Fingers[0].IsValid ) { for ( int i = 0 ; i < gestures.Count ; i++ ) { // ジェスチャー結果取得&表示 Gesture gesture = gestures[i]; switch ( gesture.Type ) { case Gesture.GestureType.TYPECIRCLE: var circleGesture = new CircleGesture(gesture); printGesture("Circle"); break; case Gesture.GestureType.TYPEKEYTAP: var keytapGesture = new KeyTapGesture(gesture); printGesture("KeyTap"); break; case Gesture.GestureType.TYPESCREENTAP: var screenTapGesture = new ScreenTapGesture(gesture); printGesture("ScreenTap"); break; case Gesture.GestureType.TYPE_SWIPE: var swipeGesture = new SwipeGesture(gesture); printGesture("Swipe"); break; default: break; } } } } // ジェスチャー結果表示 void printGesture(string str) { if ( label != null ) { label.text = str; } else { Debug.Log(str); } } }
これを配置したオブジェクトに適用します。
uGUIのTextに出力できるようにしているため、必要ならLabelにTextオブジェクトを指定してください。
これで実際に動かしてみた結果が以下です。
4種類同時に検知すると他のジェスチャーとバッティングしやすくなり、あまり精度がよくありません。
不要なジェスチャーを無効にしたりして対応する必要がありそうです。
COMMENTS & TRACKBACKS
- Comments ( 2 )
- Trackbacks ( 0 )
こんにちは。
突然のご無礼お許しください。
unity & leap motion 初心者のものです。
あなた様のブログ、とても参考させていただいてます。
そこで、質問なのですが
C#でCircleというジェスチャーを取得した時に
Aというオブジェクトを消す
というようにしたいのですが、どのようにすればいいのでしょうか。
お時間があるときで構いませんので
教えていただけないでしょうか。
コメントありがとうございます。
そして、活動休止のため返信が遅くなり申し訳ありません。
参考にしていただけてとても嬉しいです。
以下の実現方法ですが、
>C#でCircleというジェスチャーを取得した時に
>Aというオブジェクトを消す
ジェスチャーがCircleだった場合、すなわち
本記事のサンプルスクリプト中の30行目の「case Gesture.GestureType.TYPECIRCLE:」ブロック内にて、
GameObject.Destroy()メソッドを呼び出すことでオブジェクトAを消滅させることが出来ます。
例えば、オブジェクトAをGameObject型の変数Aで保持している場合は
という風に書きます。
オブジェクトAのコンポーネント(Component型)を保持している場合は
という風に書くことで実現できます。
AのコンポーネントのgameObjectフィールドにオブジェクトAの参照が保持されています。
ゲームオブジェクトの消滅のさせ方は以下の公式マニュアルに記載されていますので、あわせてご覧ください。
ゲームオブジェクトの作成および削除