UnityでLeap Motionを使ってみる

本記事は「Unity アセット真夏のアドベントカレンダー 2014 Summer!」の8/14(木)の記事になります。
昨日はやまださまによるユニティちゃんにAssetStoreで販売しているモーションをアタッチしよう!でした。

今回紹介するのはUnityでのLeapMotionの使用方法です。
ユニティちゃんゲームジャム2014 - UNITY-CHAN!でLeapMotion対応の「Unityちゃん落とし」というゲームを作成しましたので、その時に使用したAssetとUnityでLeapMotionを使用する方法について説明します。

LeapMotionを簡単にいうと『手やペンのジェスチャーによってコンピュータの操作ができるデバイス』です。
Leap Motion公式サイトで紹介されている以下の動画がわかりやすいと思います。

値段は9000〜10000円程度です。
私は梅田のヨドバシカメラで購入しました。
AmazonでもLeapMotionは購入可能です。

はじめに書きましたがユニティちゃんゲームジャム2014 - UNITY-CHAN!で作ったゲームは「Unityちゃん落とし」というゲームです。
LeapMotionを使って手の位置を取得し、Unityちゃんを穴に落とすゲーム­です。
Unityちゃんは60人いるのですが、そのうち50人を落としたタイムを競います。
仕事が忙しく1日しか参加できなかったため、このゲームは1人で4時間ほどで作成しました。

SlideShareでUnityちゃん落としの開発秘話を公開していますので興味があれば見てください。

前置きはここまでにして、本題に入ります。

まずUnityでLeap Motionを使う際の注意点ですが、AssetStoreにあるLeap MotionのAssetを動かすにはUnity Proが必要です。
→確認したところ、現在(2014/8/14)Asset Storeに登録されているLeap MotionのAssetは全てUnity Proが必要でした。
Unity freeで使用するにはLeap Motionの開発者サイトから「Download for Unity Standard(free)」を選択し、zipファイルを解凍して使用して下さい。

今回はLeap Motion V2 Skeletal Assets (beta)を使用します。

この中には11個のSceneがあります。それぞれ、以下のようなデモです。
・手を表示する基本的なデモ
 →PrettyPolyHand
 →TransparencyConfidence
・ブロック多くのブロックを手で動かすデモ
 →InteractionUtilsBlockBasics (alpha)
 →LotsOfBlocks
・ブロックをつかむデモ
 →InteractionUtilsCallbacks (alpha)
 →InteractionUtilsScaling (alpha)
 →MagneticPinch
・手を上下するとCubeが波打つデモ
 →CubeWave
・花のオブジェクトに対して触ったり花びらを取ったりできるデモ
 →FlowerAndRobot
・手の形を万華鏡のように表示するデモ
 →Kaleidoscope
・ペンを使うデモ
 →TooDarkToSee
どのデモも面白いですが、個人的にはLotsOfBlocksが好きです。
Unityちゃん落としはLotsOfBlocksをベースに作成しています。
↓LotsOfBlocksデモ


LotsOfBlocksで使われているソースコードHandController.csはUpdateで以下のUpdateHandModelsを呼んでいます。
このメソッドではアクティブ状態にある手を全て更新しています。
  private void UpdateHandModels(DictionaryList<int, HandModel> all_hands,
                                HandList leap_hands,
                                HandModel left_model, HandModel right_model) {
    ListList<int> ids_to_check = new ListList<int>(all_hands.Keys);

    // Go through all the active hands and update them.
    int num_hands = leap_hands.Count;
    for (int h = 0; h List< num_hands; ++h) {
      Hand leap_hand = leap_hands[h];
      
      HandModel model = leap_hand.IsLeft? left_model : right_model;
      // Only create or update if the hand is enabled.
      if (model != null) {
        ids_to_check.Remove(leap_hand.Id);

        // Create the hand and initialized it if it doesn't exist yet.
        if (!all_hands.ContainsKey(leap_hand.Id)) {
          HandModel new_hand = CreateHand(model);
          new_hand.SetLeapHand(leap_hand);
          new_hand.SetController(this);

          // Set scaling based on reference hand.
          float hand_scale = leap_hand.PalmWidth / MODEL_PALM_WIDTH;
          new_hand.transform.localScale = hand_scale * transform.localScale;

          new_hand.InitHand();
          new_hand.UpdateHand();
          all_hands[leap_hand.Id] = new_hand;
        }
        else {
          // Make sure we update the Leap Hand reference.
          HandModel hand_model = all_hands[leap_hand.Id];
          hand_model.SetLeapHand(leap_hand);

          // Set scaling based on reference hand.
          float hand_scale = leap_hand.PalmWidth / MODEL_PALM_WIDTH;
          hand_model.transform.localScale = hand_scale * transform.localScale;
          hand_model.UpdateHand();
        }
      }
    }

    // Destroy all hands with defunct IDs.
    for (int i = 0; i < ids_to_check.Count; ++i) {
      Destroy(all_hands[ids_to_check[i]].gameObject);
      all_hands.Remove(ids_to_check[i]);
    }
  }

7行目で手の数を取得し、8行目以降で手の数分のループを回します。
    int num_hands = leap_hands.Count;
    for (int h = 0; h List< num_hands; ++h) {

16〜29行目以降で手がまだ生成されていない場合は生成しています。
        // Create the hand and initialized it if it doesn't exist yet.
        if (!all_hands.ContainsKey(leap_hand.Id)) {
          HandModel new_hand = CreateHand(model);
          new_hand.SetLeapHand(leap_hand);
          new_hand.SetController(this);

          // Set scaling based on reference hand.
          float hand_scale = leap_hand.PalmWidth / MODEL_PALM_WIDTH;
          new_hand.transform.localScale = hand_scale * transform.localScale;

          new_hand.InitHand();
          new_hand.UpdateHand();
          all_hands[leap_hand.Id] = new_hand;
        }

30〜39行目で手の更新を行っています。
        else {
          // Make sure we update the Leap Hand reference.
          HandModel hand_model = all_hands[leap_hand.Id];
          hand_model.SetLeapHand(leap_hand);

          // Set scaling based on reference hand.
          float hand_scale = leap_hand.PalmWidth / MODEL_PALM_WIDTH;
          hand_model.transform.localScale = hand_scale * transform.localScale;
          hand_model.UpdateHand();
        }

43行目以降で存在していない手を削除しています。
    // Destroy all hands with defunct IDs.
    for (int i = 0; i < ids_to_check.Count; ++i) {
      Destroy(all_hands[ids_to_check[i]].gameObject);
      all_hands.Remove(ids_to_check[i]);
    }

これにより、手の位置をトラッキングしながら描画を行っています。

LeapMotion

このようにLeap Motionは簡単に手の動きを取得でき、面白いものが作れますので興味があれば使ってみてください!

次はUnity部さまのすべての開発者に捧げる「うに本」をコミケに出します!です。
スポンサーサイト

仮想ジョイスティックの向きをBOXの角度に当てはめる方法

完成形は
http://twitpic.com/c2jdxb
こんな感じ。


#pragma strict
var joystick : Joystick;
//var player : GameObject;

function Start () {
}

function Update () {
var r = Mathf.Atan2(-joystick.position.y, joystick.position.x);
var kakudo = (r * 180.0f / Mathf.PI) - 90.0f;
transform.rotation = Quaternion.Euler(0.0f, kakudo, 0);
}

タッチイベントを使って Cubeをぐるぐると動かす方法

あけましておめでとうございます。

新年からプログラム組んでたので、ソースをコピペします。

#pragma strict

var mCube : GameObject;
var mX : int;
var mY : int;
var mWeight : int = 30;

function Start () {
}

function Update () {
if(Input.GetMouseButtonDown(0)){
mX = Input.mousePosition.x;
mY = Input.mousePosition.y;
}
if(Input.GetButton("Fire1")){
var screenPoint = Input.mousePosition;
mCube.transform.Rotate((mY - screenPoint.y) / mWeight, -(mX - screenPoint.x) / mWeight, 0, Space.World);
}
}

【AR×MMD】Android端末でAR上でミクミクダンスを踊らせてみた。

10月20日に作ったアプリケーション「AR MMD(拡張現実×MikuMikuDance)」をGoogle Playに公開しました。

そしてニコニコ動画とYoutubeにデモ動画をうpしました。

ニコニコ動画 【AR×MMD】Android端末でAR上でミクミクダンスを踊らせてみた。


youtube 【AR×MMD】Android端末でAR上でミクミクダンスを踊らせてみた。


実は動画作成にプログラム作成の5倍以上の時間がかかっています。
環境の導入に時間がかかり、色々と大変でした。
良ければ見てください。
そして、コメントをいただけると嬉しいです。

Google Playで「AR MMD」を検索し、インストールしていただけるとこちらも嬉しいです。
無料で公開しています。

Unityで作ったアプリをAndroidマーケット公開用署名する方法

久々にブログを書きます。
というか、自分用メモです。

最近Unityをやり始めたのですが、Unityで作ったアプリをAndoridマーケットに公開する時に
公開用の署名を付けたapkファイルの作り方を解説しているサイトが無くて困ったので調べたメモです。
色々試行錯誤しながらなんとか出来ました。

って事で、解説。

まず、keytoolで非公開鍵を生成します。
これは、以下のサイトを参考に作成してください。
Androidアプリケーションへの署名についてのまとめ
keytoolコマンドで公開するandroidアプリに署名するための証明書(鍵)を生成する
簡単にまとめると、ターミナルで以下のコマンド叩けば良いです。
keytool -genkey -v -keystore hoge.keystore -storepass pass_keystore -alias alias_key1 -keypass pass_key1 -dname "CN=HOGE,O=FUGA,C=JP" -keyalg RSA -validity 10000
(パスワードとかは適当に変えて下さい。)
※Macでkeytoolを使うときはターミナルの設定をShift-JISにしておかないと文字化けするので注意。
 (なぜかはわからないけど、僕はShift-JISにしても文字化けが直らなかった。)
これで公開用のkeystoreファイルが完成します。

後はUnityでの作業になります。

Unityのメニューバーから「File」→「Build Settings…」を選択します。
以下の画面が出てくるハズです。

Unity Build Settings

「Add Current」を押して、ビルドするSceneを「Scenes In Build」に登録。
登録すると「Scenes In Build」内に「Scene名.unity」というのが増えます。

「Platform」から「Android」を選択し、「Switch Platform」を押します。
ちょっと時間がかかります。

んでもって、「Player Settings…」を押します。
以下の画面が「Inspecter」に出てくるハズです。

Player Settings 1

一番上の「Company Name」をつけます。会社名ですね。個人でやってる場合は適当につけていいと思います。
次に「Product Name」をつけます。
んでもって、「Default icon」をつけましょう。
アイコンはAndroid用の事を考えると、72×72のアイコンで大丈夫だと思います。
画像をProjectにドラッグアンドドロップして、「Default icon」の「Select」から選べばokです。

次は「Per-Platform Settings」の「Settings for Android」に行きましょう。

まずは「Rotation and Presentation」。
以下の画面です。

スクリーンショット 2012-05-05 0.50.36

「Default Orientation」は向きの固定です。
向き固定したい人は固定しちゃって下さい。
LandscapeとPortraitはググったらすぐ出てくるとおもうけど、一応書いておきます。
Landscapeが横向き。Portraitは縦向きです。
縦横対応してるアプリなら「Auto Rotation」で。

「Status Bar Hidden」はステータスバーを隠すかどうかです。

他の設定はぶっちゃけよくわからん。
とりあえず、そのままでおk。
知ってる方はコメントに書いて下さい。
(↑調べるのが面倒なだけです。)

次は「Icon」。
以下の画面です。

スクリーンショット 2012-05-05 1.01.39

って言っても、「Default icon」つけてれば、自動的にアイコンが付いてるハズです。
なんにもしなくてもおkです。
「Override for Android」でAndroid用のアイコン画像を付ける事もできますが、面倒なので自分はパスしました。
自動縮小された画像ではなく、キッチリと合ったアイコンを付けたい人は「Override for Android」で
72×72、48×48のアイコンを作れば大丈夫です。
画像をProjectにドラッグアンドドロップして、「Select」で選べばOk。

次は「Splash Image」。
以下の画面です。

splash

「Splash Image」とかいらないので僕はなにもやってません。
必要な人は調べてね。
調べた結果を教えてくれたら嬉しいな。
そんな感じです。

次は「Other Settings…」。
以下の画面です。

Other

「Other Settings…」は結構重要です。
「Bundle Identifier」はAndroidでいうpackage nameを書くところ。
まぁ、Androidやったことある人なら何書くか分かるはず。
わからない人は『Android パッケージ名』とかでググって下さいw。

「Bundle Version」はアプリのバージョン表記ですね。
初公開時は1.0でいいと思います。1.00とかでもいいけど。
バージョン上がるたびに0.1ずつとかバージョン上げて、新機能とか追加した時に2.0とかにするアレです。

「Bundle Version Code」もアプリのバージョンです。
まぁ、初公開時は1ですね。
アプリのアップデートをするたびに1ずつ数を増やしていきます。

「Minimum API Level」はAndroidのAPIレベル。
出来るだけ低い方が多くの端末で使えるってことになります。
今の世の中のAndroid端末の事を考えると、少なくともAndroid2.3以降対応、できればAndroid2.2対応しておきたいところです。
まぁ、APIレベルは使ってるAPIで決めるのがいいと思いますけどね。

他の設定は知らね。
とりあえず、デフォルトでOKじゃね?
そんな感じです。
知ってる方はコメントに書いて下さい。
お願いします。
(↑調べるのが面倒なだけです。)

ラスト「Publishing Settings」。
以下の画面です。

Publishing

ここで、一番初めに作った公開用のkeystoreを使います。
「Keystore」で「Use Existing Keystore」にチェックを入れます。
「Browse Keystore」ボタンをクリックし、一番初めに作ったKeystoreを選択します。
んで、「Keystore password」を入力。

正しく入力出来ると、「Key」の「Alias」でKeystoreで登録したAliasが選択出来るようになります。
もちろん、Keystoreで登録したAliasを選択します。

ここまで来たら、Unityのメニューバーから「File」→「Build Settings…」を選択して「Build Settings…」の画面を出し、
「Build」を選択します。

Unity Build Settings

「Save as」と聞かれるので、apkのファイル名と保存先を決めればOKです。

これで公開用署名付きのapkファイルが作成できます。
あとはAndroidマーケット(Google Play)に公開登録してください。


追伸。
Unityで作ったアプリをAndroidマーケットに公開用署名する方法をダラダラと解説書いてたら2時間くらいかかった……。
さすがに疲れた……。
プロフィール

hima_zinn(新社会人になってこれから忙しくなる暇人)

Author:hima_zinn(新社会人になってこれから忙しくなる暇人)
 
メインブログを移行しました。
http://hima-zinn.hatenablog.com/

Androidプログラマー。
ゲーム、マンガ、邦楽が大好き。
好きなゲーム…大神、ベヨネッタ、428、スマブラ、バーンアウト、クレタク、マリカー、VANQUISH、デビルメイクライ、デモンズ、ワンダと巨像、逆裁、NMH、勇なま、シレン、DiabloⅡ、ダンガンロンパ、ほか多数。
好きなゲーム会社はプラチナゲームズです。
好きなマンガ…イキガミ、デスノ、ONE PIECE、ハガレン、アライブ、GANTZ、エヴァ、バクマン、ONE OUTS、ほか多数。

最新記事
カテゴリ
最新コメント
最新トラックバック
月別アーカイブ
検索フォーム
カウンター
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
RSSリンクの表示
リンク
QRコード
QR
ブロとも申請フォーム

この人とブロともになる