Unityでデータ保持用のクラスを扱う時に戸惑ったお話

こんにちは!
8月と9月に会社訪問やインターンハッカソンで忙しかったころんです。

 

今回はハッカソンでUnityを使った時にちょっと戸惑ったことがあったのでメモメモ 

 

やりたかったこ

 実装したかった流れは以下の通り。

 

  1. サーバーから取ってきたクライアント情報を保持するためのDictionaryが存在し、データ保持用クラスのメンバにはアイテム保持用のリストが宣言
  2. クライアント情報をDictionaryに追加し、クライアントごとにプレハブを生成
  3. 生成したプレハブをUnity上のInspectorで値を確認、編集できるようにしたい

 

今回はデータ構造が入れ子になってごちゃっていますが、許してw

でっこれの何が問題かというと、実行すると確かにアイテムデータは格納されているんですが、InspectorにはNoneと出ちゃうんですよね。

デバッグでInspectorをいじりたいこともありますし、これでは困ります。

 

検証コード

Unityバージョン:2017.1.1f1 Personal(5.6シリーズでも確認済み)

 

コードはこちら↓

ServerManager.csはサーバーからデータを取ってくることを想定。

ClientDataにはアイテムを格納するリストが存在し、専用のクラス(ItemData)も用意

gist.github.com

gist.github.com

gist.github.com

 ServerManager.csを空のGameObjectにアタッチ。ClientData.csはGameObjectに
アタッチした後プレハブ化し、ServerManagerのclientPrefabに適用しています。

確認のためにDictionaryの中身もDebug.Logで表示。

 

これを実行すると以下のようになります

f:id:Collonville:20170927011355j:plain

f:id:Collonville:20170927011359j:plain

Debugではきちんと値が格納されていることが分かります。

しかし、InspectorではItemListの中身はどれもNoneのままです。不思議ですねぇ~

 

原因

ItemData.csに継承しているMonoBehaivourが原因です。

MonoBehaivourを継承することにより、そのクラスはGameObjectとしての挙動を示します。そのため、ItemListにはデータ構造としてのItemDataではなく、GameObjectとしてのItemDataが格納されるため、値が表示されなくNoneとして表示されます。

 

Unity上でクラスを作ると自動的にMonoBehaivourが付いてくるので、気づかないでいたって感じです。

 

docs.unity3d.com

 

kan-kikuchi.hatenablog.com

 

直し方

修正は簡単。ItemDataに継承されているMonoBehaivourを削除するだけです。

修正後のItemData.csと実行結果↓

gist.github.com

f:id:Collonville:20170927015223j:plain

これで無事にInspector上で値の確認ができました!

 

おわりに

今回は、データ構造が入れ子になっている時にMonoBehaivourが原因でInspectorで値が確認できない現象の解決を行いました。

 

本当は、ClientDataのMonoBehaivourも消せれば理想ですが、ServerManagerでGetComponentを使っているので残さないとエラーになります。

 

あんまり遭遇することがない事例だとは思いますが、お役に立てば幸いです。

 

 

 

 

TechnoTUT 新アルバム「Summery Days」

今所属している音楽サークルのTechno TUTですが、無事に今年度初のアルバムを

公開することができました。

 

 

じゃん!!

f:id:Collonville:20170722142631j:plain

 

あぁ、すごい良い。可愛くてかっこいい。

 

アルバムのテーマは「夏」で、新入生2人と既存部員で4曲集まりました。

みんなの個性がハッキリ出ててなかなかおもしろかったw

今回は任意提出でしたが、10月の技科大祭には全員が提出する予定です。

 

アルバムはBootCampでBuy NowからName your priceを0にすれば無料でDLできます!

(もちろんお金を払って購入することも)

technotut.bandcamp.com

ちなみに過去アルバムも整理してから順次公開していくのでお楽しみに。

 

自分が今回作ったazuriteのJ-Coreアレンジですが、Sound Cloudでも確認できます

soundcloud.com

 

うん、ダンスミュージック系のトラックメイク慣れてないせいか難しい。。。

あとSpireSylenth1

せっかくなので、このアルバムに関するマスタリングの記事も書こうと思います

 

最後ですがCD情報も掲載

 

「Summery Days」

Illust : AIR, Design : ayafmy, Mastering : ころんP

1. 0801 - さんまのこぼね

2. 初夏の夜 - ぽねき

3. azurite(CollonP J-Core Remix) - ころんP

4. 残花 - 武

TUT Advent Calendar19日目

この記事は、TUT Advent Calendar 2016 - Adventarの19日目の予定だった記事です。

 

どうもこんにちわ、ころんです。

本当は、今やってる研究の話とか何か新しい分野の開拓でもして記事にしようかなと思っていたのですが予想以上に研究が忙しくなりAdCに書くのも忘れてましたw

 

あと2日目で研究発表をして、卒論を出したら冬コミのアルバムの製作も予定されており、年末まで忙しい日々になります。

 

何を書こう

何を書こう、、、特に書くこともないですが体調面についてちょっと。

 

 

生活習慣には気をつけよう!

f:id:Collonville:20161220192325j:plain

 

知っている人もいますが、自分は不整脈持ってます。よくあるタイプの心室性期外収縮というものです。

www.miyake-naika.or.jp

 

原因は、高専時代の生活習慣ですね。プロコンとかでよく徹夜してたせいでいよいよ病気になりました。

生活面には支障はないですが、やっぱり心臓関係の病気は怖いです。

 

その後の大学でも某イ○○トなウ○○会社のブラックなところでバイトしたり、今は研究で昼夜逆転生活。

なぜかブラックを呼び寄せるようなことばかりですが、さすがにもう辛いですね。

特に自分はストレスを抱えても体調に反映されないんで無理しちゃう傾向があるそうです。

 

このままだとなんか突然死とかも起こりかねないので、来年度からはもっと自分の体を大事にしようかと思います。

 

 

まとめ

ほんと書くことなくてごめんなさいwwwwww

とりあえず自分が言いたいのは

 

早く寝る!
無理しない!
いいものを食べる!

 

以上!!!

パワー正規化(Power Normalization)について

そろそろ研究もまとめに入らないと理系学生が死んじゃう時期になりましたねw

 

自分は、イラストの類似検索の研究をしていますがその中でパワー正規化っという聞きなれない用語が出てきたのでまとめてみました。

 

さまざまな正規化

データの正規化っていろいろあります。

 

L1正規化
L2正規化
平均0・分散1にする正規化

いずれも機械学習においてデータの整合性を取るために大事なものです。

正規化自体、あるルールに基づいて値を変形し使いやすくするという意味だそうです(by Wikipedia)

 

パワー正規化のルール

パワー正規化も同じように下記のルールに基づいて値を変形します。

(はてブロで数式表示したいんだけどやり方がいまいちわからない)

 

f(z) = sign(z)*|z|^a

 

式を見ると元のデータの符号を保ったままべき乗するというルールになっており、パラメーターaは0~1の範囲で選びます。

 

0~1の範囲でべき乗することによって元々1より小さい値は大きく、1より大きい値は小さい値になります。

 

いつ使うの?

パワー正規化は主にスパースベクトル(ほとんど0要素なベクトル)に使うことが多いようです。

画像処理では、自然画像(いわゆる普通の画像)に比べてイラスト画像は使っている色情報が少ないため0要素(0に近い要素)が多くなってしまいます。

音声処理でも似たような単語がありましたが、意味は違うっぽいです。

 

その中で、普通だったら無視されるような値も、特徴の1つとして捉えるようにしようということをしたくてパワー正規化を行います。

自分の研究の場合、パラメーターaを調整することによって検索性能は6%ぐらい上がりました。

 

最近ではFisher Vectorを使う手法が増えてますが、その中でもパワー正規化を使うことで精度向上に貢献しています(p31,35)

www.slideshare.net

 

まとめ

 

パワー正規化について書かれている記事が全然なかったので簡単にまとめてみました。

あなたの研究もパワー正規化で精度向上!?なんてことも???

 

 

 

 

 

MATLABでlibsvmを使用するための手順

研究でSVMを使用したくなったんですけど、どうもMATLAB標準のSVMでは多クラス判定がすごい複雑そうだったのでMATLAB上でlibsvmを使用しました。

 

OS:Windows 7 Pro 64bit

MATLABバージョン:R2016a(9.0.0.341360)

 

用意するもの

libsvmをgitからそのまま落として適当なディレクトリに解凍しておきます。

libsvmは多様な言語に対応してくれてるのがうれしい。

github.com

 

 

MATLAB上での作業

MATLABに先ほどおとしてきたlibsvmのパスとコンパイルを通します。

 

1.コマンドウィンドウを開き「mex -setup」を入力します。

2.「cd('C:\...\libsvm-master\matlab\')」cdコマンドで落としてたlibsvmMATLAB

 フォルダの中に入ります。

3.「make」でコンパイルします。

4.成功したら「libsvmread.mexw64、libsvmwrite.mexw64、svmpredict.mexw64、

 svmtrain.mexw64」の4つのMATLABプラグインが生成されます。

5.最後にcdで入った同じパスを「addpath('C:\...\libsvm-master\matlab\)」で

 MATLAB上にパスを通して終了です。

 

最後にテストコードを書きますが、それはまた後で

 

 

 

「Unity5 + PS Move + PS Eye」 ペアリングから実行までのまとめ

こんにちわ、今抱えてるプロジェクトが3月末までと言われて焦り気味のころんです。

 

会社の案件でUnityとPS Move、PS Eyeを使ったプロジェクトを進めているのですが、ペアリングから実行するまでかなり手間がかかったので自分のまとめとして記事にしてます。

自分の開発環境はたぶんほとんど最新バージョンで組み合わせているので、このやり方でやればだいたいはうまくいくと思います()

開発環境

以下が今回実行した環境になります。

  • OS : Win10 Home 64bit
  • RAM : 8GB
  • グラボ : GeForceGTX 760
  • Unity5.3.3 64bit

PS Moveは2010年と2012年モデルの2つがあるそうですが、今回は2012年モデルのほうを使います。

 

Amazon.co.jp: PlayStationMove モーションコントローラ: ゲーム

Amazon.co.jp: PlayStationEye: ゲーム

PS Eyeの設定

PS EyeはPS Moveの空間位置推定用の使います。端子がUSBなので一般的なWebカメラとしてすることも可能です。

ですが、使用するためのドライバをCode Laboratorieから有料(2.99$)で購入する必要があります。Vペリカでの支払いもOKでした。

CL - Downloads - Code Laboratories

購入後、指定したメールアドレス宛にDL用のリンクを送られてきますので、落としてインストールします。インストーラー起動後はポンポンっと「Next」を押します。

 

f:id:Collonville:20160307014711p:plain

 

インストール後、USB端子をパソコンに挿してPS Eyeの設定は完了です。

f:id:Collonville:20160307014917j:plain

 

ちなみに、無料で使えるドライバが一応あるのですが、確実に動きたかったので今回はパスします。使えた方がいれば教えてください

www.emuline.org

 PS Moveの設定

ここからが一番戸惑いました。おそらく、Unity + PS Moveで検索された方は以下のサイトを巡っていると思います。

 

ウダサンコウボウ: PlayStationMoveをPCかつネットワーク経由で使えるPSMoveServer

UnityでPSMoveを使うときの注意点 - Cross Road

Oculus用操作デバイスの検討(PSMove) - Cross Road

Copenhagen Game Collective – an experimental games collective - Unimove

PS Move API (thp.io)

以上のサイトに乗っているやり方を試しましたが、全部だめでしたね。理由として

  • iPiを起動してPS Moveを接続してもそれ以降進まない!
  • Motion In JoyでペアリングはできるけどBluetoothアダプタが内部で統一可されてUnityで認識しない!!
  • Motion In Joyでペアリングする前にBIOSでドライバ署名を無効にしないといけない!!
  • PS Move APIにpsmovepair.exeがない!!(CMakeがあるから自分でやれってことかな)
  • なんとかUnityに入れてもエラーエラーエラーエラー
  • そもそもPS MoveBluetooth一覧に表示されない

 などなど、いろんな要員が絡んで正直ダメかと思いましたけどできました。

 

動作するまでの手順は以下のようになります。

  1. psmovepair.exeとUSBケーブルでつなげたPS Moveを使ってとりあず仮認識
  2. psmove-pair-win.exeを使ってbluetoothドライバの認識
  3. magnetometer_calibration.exeでPS Moveキャリブレーション
  4. Unityで実行

で、これらのexeファイルをここから落としてきます。

もう~感謝感謝感謝!!!って感じ

Unreal Engineと書いてありますが、必要なexeファイルは関係ないのでまるごと落としてきたほうが良いです。

 

USBケーブル(Mini Type-B)でPCとPS Moveを接続した状態でpsmovepair.exeを起動します。すると以下のような画面が出ます

f:id:Collonville:20160307022555p:plain

説明通りにPS Moveの真ん中にあるPSボタン(PSマークが描かれたボタン)を押すと、SONYと書かれたマークの下にある赤色LEDが点滅します。

しばらくすると消えるので再度PSボタンを押してこれを5,6回繰り返します。

 

次に、psmove-pair-win.exeを起動します。

ここでBluetoothのペアリングをしますが、以下のように

!!!! Successfully connected device xx:xx:xx:xx:xx:xx !!!!

が出てくるまで、根気よくPSボタンを押してください(10秒押し続けると電源ごと消えるので点滅が消えたころに)

もともとWindows環境でのペアリングはうまくいくときと行かないことが多いので。

f:id:Collonville:20160307023429p:plain

ペアリングが完了するとPS MoveのLEDが点灯し続けます。

 

次にキャリブレーションを行います。

magnetometer_calibration.exeを起動すると以下のように表示されて、PS Moveの先端が光ります。

f:id:Collonville:20160307024111p:plain

f:id:Collonville:20160307024417j:plain

この状態でPS Moveを様々な方向に向けます。おそらく磁気キャリブレーションを行っているためかと。すると画面上の数値をどんどん増えていくのでどこへ向けても数字が変わらないってところで、PS Moveの中央上にある縦長のボタン(Moveボタン)を押します。

ちなみに自分は287.0が限界でした。

 

f:id:Collonville:20160307024752p:plain

次に、PS Moveを垂直に立てた状態にして、Moveボタンが自分の正面に来るように持っていきます。すると自動的に解析が始まるので、そのままの体勢を維持します。終わると自動的にプログラムを終了します。

解析が始まらない場合は、場所を変えたりしてみてください。

Unityでの実行

ここまでやればほとんど終わりです。PS Move APIをUnity5で動かせるようにしたリポジトリがあるのでそれを落としてきます。

このプロジェクトファイルをそのままUnityで開いて実行します。

 

f:id:Collonville:20160307025622p:plain

 「Play」ボタンを押すと

 

f:id:Collonville:20160307030223p:plain

するとPS Moveで動かした姿勢がモデルに反映されます。

カメラが見つかりませんなどのエラーが出た場合はカメラのUSBを1回抜いたり、Unityごと再起動すると直ります。

 

面倒ですが、パソコンを再起動するたびにこれらのことをしないといけないそうです。

 

まとめ

以上がUnityとPS Move、PS Eyeを使った環境構築方法です。

これ以外で簡単な方法があれば教えてくださいw

 

PS Moveを使ってみた感想としては、かなりいい精度トラッキングしてくれます。姿勢検知も問題なく動作しますし、Wii Remoteより断然いいです。

 

ある程度予想はしていましたけど、ここまでほぼ半日かかりました。

これでやっとプロジェクトを進められます!!

 

 

 

 

C#やるんならLINQ!!

この記事は TUT Advent Calendar 12日目の記事です!

 

みなさん、お久しぶりです。

技術ブログとして立ちあげましたが、全然記事書かないまま1年が過ぎました(べ、べつに書くネタがないわけじゃないんだからね

TUTに来て、新しい友達も増えて楽しい日々を送ってますよ。講義も後期から大幅に減ってUnityのアルバイト始めたり、趣味も新しく増えたり。もちろん今年のクリスマスも予定空いてますよ?

C#!!

さてさて、本題に入ります。C#便利ですよね。

プロパティ、ファイル操作、非同期処理、WPF、Azure・・・などなどWindows環境で動くソフトウェアに特化してます。最近ではUnityでも定着してますし、Visual Studioとの連携がよくとれているので自分のお気に入り言語ナンバーワンです。

 

そんな便利なC#LINQっていうの知ってますでしょうか??(九州の某アイドルではありませんよ

周りにちょこっと聞いてみましたが、初めて聞いたって人や、知らずに使ってた人などあんまり知られていないのかなと思いましたね。ですので、今回ぜひC#erにこの便利な機能を紹介したいと思い記事を書きました。

では逝きますか!(1919

LINQってそもそもなんぞや??

まずは、そもそもLINQって何者かを紹介します。

LINQはLanguage-Integrated Queryの略で日本語では、統合言語クエリと言われてます。

クエリって何?って思った方。クエリとは「問い合わせる」という意味で、一般的にデータの問い合わせ要求に使われます。一番わかりやすいのがデータベースとかですかね。あるデータベースにあるテーブルから、条件に合うカラムを持ってくる命令を1つの文字列として表現します。例えばこんなの

mealというテーブルから値段が1000円未満の商品名を出す、クエリーの例です。

こういう感じでデータの問い合わせに関する構文を並べるだけです。実はLINQもこれと同じで

 

データの問い合わせや更新をもっと楽にできるようにしよう!!

 

っというものです。じゃそのデータって何に対して言っているのかというと、配列・リスト・オブジェクトを指してます。

 

LINQにもいろいろ種類があります。

  • LINQ to Objects(配列、コレクション、任意のオブジェクト)
  • LINQ to Entities(Entity Framework経由でのデータベース)
  • LINQ to XML(ざむる)
  • LINQ to SQL(SQL サーバー)

今回はLINQ to Objectをメインにやっていきます。

何ができるの??

LINQの正体をざっと伝えたところで、何ができるかを紹介します。

LINQは配列やリストに対してデータの問い合わせ・更新などを楽にできるようにしようっというものでした。これらのデータ構造を使うっということは、あるデータを一時的に格納しておき、その要素に対して何か操作を行うってことです。

例えば、整数の入っているリストから5以上の整数リストを新しく欲しい時、こういう感じで書きませんか?

リストを反復構文で回してif文で条件に合う数値を新しいリストに追加しています。

なんか、単純なことをしているだけなのにこんなので10行近くも使っているのが、なんか嫌ではありませんかね?

しかし、LINQを使ってあげると以下のようになります。

gist.github.com

結果の表示をもうちょっと変えてみましょう。

gist.github.com

なんと、LINQを使ってあげることでここまで省略されました。10行使っていた処理が3行になりましたね。これが

データの問い合わせや更新をもっと楽にできるようにしよう!!

です。

コードをよく見ると反復構造であるforやforeachがありませんLINQを使うことによって書く必要性が無くなったんですね。

初めて見る方にとっては気持ちの悪い書き方であると思います。私もそうでした。しかし簡単な例から学んでいくと自然にこっちの書き方が欲しくなりますよ?(麻薬と一緒だね)

LINQとしてできることは、

 

forやforeach文を書かなくても
条件を満たす要素を抽出・更新・ソートなどができる!
 

です。そのためにLINQでは多くのメソッドが提供されています。

できることは、Sample1-3のような条件検索以外のもたくさんありますが。ここでは主に使うだろうものだけ書いておきます。

 

LINQを使ってみよう

じゃ、この便利なLINQをどうやって使えばいいのか。簡単です。ソースのusing欄に

using System.Linq;

これを追加するだけで、使えるようになります。Visual Studioの場合プロジェクトを作成すると自動的に追加されてるはずです。

 

ちなみに、LINQの処理をして結果を格納するとき返り値はList<T>にはなりません。IEnumerable<T>型になるので注意してください。

garicchi.hatenablog.jp

Select()

格納している要素1つずつに対して関数を適用して返します。情報数学で言う写像に似ています。

gist.github.com

サンプルでは、リストの要素に対して「x * x」という関数を適用して返しています。つまり2乗した数が返ってきます。

格納しているデータに対して加工を行うのは頻繁にあることなんで、覚えておきましょうね。

 

Where()

Sample1-3で出てきたWhere()です。これは、条件に合う要素をフィルタリングして返すっということをしています。

gist.github.com

サンプルでは、リストの要素のうち偶数である数値をフィルタリングして返しています。じゃ、AND演算のように複数条件はできるのか?できます

gist.github.com

先ほどの条件に5未満であるを追加しました。これで反復構造中のif文の代わりになります。

 

Count()

 特に説明することはなく、ただ要素数のサイズを取得します。

gist.github.com

 

Sort()

指定した要素でソートします。OrderBy()を使うことによって他クラスにある要素でのソートが可能になります。

gist.github.com

サンプルは、Playerクラスを作って要素としてHPと名前を持っています。リストの初期値にPlayerクラスを4つ挿入しておき、HP順とアルファベット順でそれぞれソートを行うものです。

実行結果は以下の通りで、きちんとHP順とアルファベット順でソートできていると分かります。

f:id:Collonville:20151212041907j:plain

降順にしたい場合はOrderByDescending()を使います。

 

その他

結構種類あるので紹介しきれないです。リンクを張っておきますので、各自で調べてみてください。

.Net(VB C#) LINQメソッド一覧:http://yan-note.blogspot.jp/2015/11/netvb-clinq.html

 

ちょっと応用

LINQの各メソッドはそれぞれ繋げることができます。例えば、リストにある要素を全て2倍にして14以下である数値が何個あるか調べる場合、

gist.github.com

このように

2倍する-->14以下である数をフィルタリングする-->数を数える

の流れが自然に組めるのもLINQの特徴の1つです。

 

遅延評価

本当ここがLINQの一番大事なところなんですが、正直もう書く気力がありませんのでまた別の記事に書きたいと思います。

 

まとめ

LINQはコレクションに対してデータの操作を簡単に記述できるようにするためのものです。そのおかげで、生産性やコードの可読性がぐぅんと上がります。

使うことができるメソッドが大量にあるので暇なときに調べてみると使えそうなものがヒットするかも。

 

明日はドイツの鳥で有名なあしゅりーさんの「座標で見る"TUT大学構内のレッドブル自販機100選"」です!。


あれ?TUT内にそんなに自販機あったけな????