Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
Unityゲーム・エンジンでのLeap Motion開発[C#]

Unityゲーム・エンジンでのLeap Motion開発[C#]

  • このエントリーをはてなブックマークに追加

連載:Leap Motion開発入門(C#編)

【obsolete: 旧コンテンツ】 Leap Motion Developer SDKを使ってUnityのゲーム・アプリを開発する方法を説明する。手の指の動きに合わせてゲーム・オブジェクトを自由に動かそう。

Natural Software 中村 薫
2013年9月19日
本稿はLeap Motion SDK バージョン1に基づいた記事です。すでにバージョン2の連載記事に改訂しており、その改訂の際に本稿の内容はカットされました。同じLeap Motionデバイスで、最新のSDKバージョン2を利用できますので、最新版SDKをご利用ください。

 今回は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」フォルダにドラッグ&ドロップする
Leap SDKのPluginsをアセットとして設定する
2. Unityのプロジェクトにある「Plugins」フォルダの右クリック・メニューから[Create]-[C# Script]を実行して、C#の新規スクリプトを作成する。そのスクリプト・ファイルの名前を、ここでは「LeapBehaviourScript」とする(必ずファイル名と、ファイル内に記述されるクラス名を合わせること。その方法は後述)
「LeapBehaviourScript」という名前のC#スクリプトを作成する
3. 作成した「LeapBehaviourScript」をダブルクリックすると、コーディング環境のMonoDevelopが起動するので、下記のコードを記述する
C#スクリプトを編集する
C#
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;
  }
}
Leap Motionで取得した指の数をFingerCountフィールドに設定するC#スクリプト(LeapBehaviourScript.cs)

 FingerCountフィールドに、Leap Motionが検出した指の数を設定する。FingerCountフィールドをpublicにしているため、後述する[Inspector]ビュー(以降、Inspector)で値を見ることができる。

1. Unityに戻り、メニューバーの[GameObject]-[Create Empty]を選択し、空のシーンを作成する。作成したシーンは「LeapScene」という名前にする
空のシーンを作成する([Hierarchy]ビューの「GameObject」の右クリック・メニューから[Rename]を選択して「LeapScene」に名前を変える)
2. 「LeapScene」を選択し、Inspectorを表示して、「LeapBehaviourScript」をInspectorの中へドラッグ&ドロップする
「LeapScene」のInspectorにC#スクリプトを追加する
3. この状態で実行すると、前述したとおりに、Inspectorの[Finger Count]にLeap Motionで検出した指の数が表示される
C#スクリプトを実行する

プログラムの作成(スクリプト編集)

 ここまででLeap SDKがUnityで動作することを確認できたので、実際にオブジェクトをLeap Motionで動かしてみよう。LeapBehaviourScript.csファイルを次のように書き換える。

C#
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 );
  }
}
Leap Motionで取得した指の座標を、FingerObjectsフィールドに格納されたSphere(=球体)ゲーム・オブジェクトに設定するC#スクリプト(LeapBehaviourScript.cs)

 このコードでは、前掲のコードで説明したFingerCountフィールドに加えてさらにFingerObjectsフィールドを追加している。このFingerObjectsフィールドには、Unity側でSphere(=球体)ゲーム・オブジェクトを設定する(詳細後述。指5本分の5つのSphereゲーム・オブジェクトを設定する)。

 Updateメソッド内を見ると、(ループを回しながら)各Sphereゲーム・オブジェクトに対して以下の処理を行っている。

 (1)Leap Motionで検出した指の座標情報を、leapFinger変数に設定する。

 (2)SetVisibleメソッドでは、検出した指の有効/無効状態によって、Sphereの表示/非表示を変えている。

 (3)指が有効であればInteractionBoxオブジェクト(=インタラクション・ボックス)を使ってLeap Motionの座標系をディスプレイの座標系に変換する。インタラクション・ボックスは下記のイメージだ。

各種ゲーム・オブジェクトを追加する
インタラクション・ボックス(Leap Motion SDKのAPIドキュメントから引用

 今回は単純に表示するため、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つずつドラッグ&ドロップする(次の画面を参照)。

FingerObjectsフィールドに各Fingerオブジェクト(=「Sphere」ゲーム・オブジェクト)を追加する

プログラムの実行

 以上で実装は完了だ。実行すると、次の画面に示すように、指の動きに合わせてSphereが動くのを確認できる。

指の動きに合わせてSphereが動く(正しく表示するには、メイン・カメラの位置を調整しておく必要がある)

まとめ

 このようにUnityでも簡単にLeap Motionを利用できる。あとはコンテンツのアイデア次第だ。

 次回からはLeap SDKの機能を解説する(基本的に、C++の連載と同じ内容をC#で書き直したものになる)。

サイトからのお知らせ

Twitterでつぶやこう!