Unityゲーム・エンジンでのLeap Motion開発[C#]
連載:Leap Motion開発入門(C#編)
【obsolete: 旧コンテンツ】 Leap Motion Developer SDKを使ってUnityのゲーム・アプリを開発する方法を説明する。手の指の動きに合わせてゲーム・オブジェクトを自由に動かそう。
今回はUnityゲーム・エンジンでのLeap Motion開発について解説する。
サンプル・コードは次のリンク先で公開しており、Unity Pro 4.2.1f4で動作確認を行っている(トライアル版での動作確認も可能だ)。
Unityでの環境設定
UnityでLeap SDK(Leap Motion Developer SDK)を使った開発をする場合には、アセット(Asset)のネイティブ・エクステンションという機能を利用する。これはUnity Proの機能になるので、Unity Proがライセンスされた環境、またはUnity Proトライアル版でのみ利用できる。
1. Leap SDKの「lib\UnityAssets」フォルダにある「Plugins」フォルダを、Unityの[Project]ビューの「Asserts」フォルダにドラッグ&ドロップする
2. Unityのプロジェクトにある「Plugins」フォルダの右クリック・メニューから[Create]-[C# Script]を実行して、C#の新規スクリプトを作成する。そのスクリプト・ファイルの名前を、ここでは「LeapBehaviourScript」とする(必ずファイル名と、ファイル内に記述されるクラス名を合わせること。その方法は後述)
3. 作成した「LeapBehaviourScript」をダブルクリックすると、コーディング環境のMonoDevelopが起動するので、下記のコードを記述する
using UnityEngine;
using System.Collections;
using Leap;
public class LeapBehaviourScript : MonoBehaviour {
Controller controller = new Controller();
public int FingerCount;
void Start()
{
}
void Update()
{
Frame frame = controller.Frame();
FingerCount = frame.Fingers.Count;
}
}
|
FingerCountフィールドに、Leap Motionが検出した指の数を設定する。FingerCountフィールドをpublicにしているため、後述する[Inspector]ビュー(以降、Inspector)で値を見ることができる。
1. Unityに戻り、メニューバーの[GameObject]-[Create Empty]を選択し、空のシーンを作成する。作成したシーンは「LeapScene」という名前にする
2. 「LeapScene」を選択し、Inspectorを表示して、「LeapBehaviourScript」をInspectorの中へドラッグ&ドロップする
3. この状態で実行すると、前述したとおりに、Inspectorの[Finger Count]にLeap Motionで検出した指の数が表示される
プログラムの作成(スクリプト編集)
ここまででLeap SDKがUnityで動作することを確認できたので、実際にオブジェクトをLeap Motionで動かしてみよう。LeapBehaviourScript.csファイルを次のように書き換える。
using UnityEngine;
using System.Collections;
using Leap;
public class LeapBehaviourScript : MonoBehaviour {
Controller controller = new Controller();
public int FingerCount;
public GameObject[] FingerObjects;
void Start()
{
}
void Update()
{
Frame frame = controller.Frame();
FingerCount = frame.Fingers.Count;
InteractionBox interactionBox = frame.InteractionBox;
for ( int i = 0; i < FingerObjects.Length; i++ ) {
var leapFinger = frame.Fingers[i];
var unityFinger = FingerObjects[i];
SetVisible( unityFinger, leapFinger.IsValid );
if ( leapFinger.IsValid ) {
Vector normalizedPosition = interactionBox.NormalizePoint(leapFinger.TipPosition );
normalizedPosition *= 10;
normalizedPosition.z = -normalizedPosition.z;
unityFinger.transform.localPosition = ToVector3( normalizedPosition );
}
}
}
void SetVisible( GameObject obj, bool visible )
{
foreach( Renderer component in obj.GetComponents<Renderer>() ) {
component.enabled = visible;
}
}
Vector3 ToVector3( Vector v )
{
return new UnityEngine.Vector3( v.x, v.y, v.z );
}
}
|
このコードでは、前掲のコードで説明したFingerCountフィールドに加えてさらにFingerObjectsフィールドを追加している。このFingerObjectsフィールドには、Unity側でSphere(=球体)ゲーム・オブジェクトを設定する(詳細後述。指5本分の5つのSphereゲーム・オブジェクトを設定する)。
Updateメソッド内を見ると、(ループを回しながら)各Sphereゲーム・オブジェクトに対して以下の処理を行っている。
(1)Leap Motionで検出した指の座標情報を、leapFinger変数に設定する。
(2)SetVisibleメソッドでは、検出した指の有効/無効状態によって、Sphereの表示/非表示を変えている。
(3)指が有効であればInteractionBoxオブジェクト(=インタラクション・ボックス)を使ってLeap Motionの座標系をディスプレイの座標系に変換する。インタラクション・ボックスは下記のイメージだ。
今回は単純に表示するため、Unityのカメラ範囲に合わせて座標を調整している。
(4)最後に、Sphereゲーム・オブジェクトのtransform.localPositionプロパティ(=transformプロパティで得られるTransformオブジェクト(UnityEngine名前空間)のlocalPositionプロパティ)に変換後の座標を設定する。これによって、指の座標に合わせてSphereを動かせるようになる。
プログラムの作成(Unityモデリング)
続いて指を表すゲーム・オブジェクトと光源を追加する。「Sphere」ゲーム・オブジェクトを5つ、「Directional Light」ゲーム・オブジェクトを1つ追加する。Sphereゲーム・オブジェクトは、「Finger1」~「Finger5」と名付け、LeapSceneの下に移動する(次の画面を参照)。
Unityに戻り、メニューバーの[GameObject]-[Create Other]-[Sphere]を選択して、「Sphere」ゲーム・オブジェクトを5つ作成する。さらに、[GameObject]-[Create Other]-[Directional Light]を選択して、「Directional Light」ゲーム・オブジェクトを1つ作成する。
LeapBehaviourScriptのFingerObjectsフィールドの[Size]を「5」に設定する。これにより[Size]の下に[Element0]~[Element4]が作成されるので、[Hierarchy]ビューに追加したFinger1~Finger5をその[Element0]~[Element4]に順番に1つずつドラッグ&ドロップする(次の画面を参照)。
プログラムの実行
以上で実装は完了だ。実行すると、次の画面に示すように、指の動きに合わせてSphereが動くのを確認できる。
まとめ
このようにUnityでも簡単にLeap Motionを利用できる。あとはコンテンツのアイデア次第だ。
次回からはLeap SDKの機能を解説する(基本的に、C++の連載と同じ内容をC#で書き直したものになる)。