「授業用」カテゴリーアーカイブ

UnityでList<>を使う(NCMB関連)

NCMB(Nifty Cloud Mobile Backend)のデータ検索の際のサンプルスクリプトの

//QueryTestを検索するクラスを作成
NCMBQuery<NCMBObject> query = new NCMBQuery<NCMBObject> ("QueryTest");
//Scoreの値が7と一致するオブジェクト検索
query.WhereEqualTo ("Score", 7);
query.FindAsync ((List<NCMBObject> objList ,NCMBException e) => {
    if (e != null) {
        //検索失敗時の処理
    } else {
        //Scoreが7のオブジェクトを出力
        foreach (NCMBObject obj in objList) {
            Debug.Log ("objectId:" + obj.ObjectId);
        }
    }
});

を使うとコンパイルエラーでる

List<>が使えないっていうエラーです.

で,includeすれば使えるらしいんです

using System.Collections.Generic;

これを.

ネットワーク時刻を取得するときにも似たようなのを使いました.

Nifty Cloud Backend Androidビルド後のエラー

ビルドは成功するものの,端末側でインストールできず.

インストールしようとすると「ファイルの解析に失敗」と出る

原因:不明

解決策:NCMBのSDKをVer.2.0.0にダウングレードする(2.2.2>2.1.1 でもエラー発生)

参考:

https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/493

Unity(5.3)とNCMBのコンフリクトなのか?

Nifty Cloud Mobile Backend使い方

理由 iOSアプリは通信が全てhttpsでないとダメ

自鯖でhttps使えなくもないけど,認証系にも使いたい

新規アカウント作成後の最初のチュートリアル(APIキーの設定系など)

http://mb.cloud.nifty.com/doc/current/introduction/quickstart_unity.html

Psuh通知でMonacaの参考方法を参考にした

https://docs.monaca.io/ja/manual/backend/push_notification/gcm/

NCMBエラーコード一覧

http://mb.cloud.nifty.com/doc/current/rest/common/error.html

メモ 引数eで受けたら, e.ErrorCode でエラーコードをStringで入る

サンプルのコードそのまま

using UnityEngine;
using System.Collections;
using NCMB; //use Nifty Cloub Mobile Backend

public class NCMB_test : MonoBehaviour {

	// Use this for initialization
	void Start () {


		// クラスのNCMBObjectを作成
		NCMBObject testClass = new NCMBObject("TestClass");

		// オブジェクトに値を設定

		testClass["message"] = "Hello, NCMB!";
		// データストアへの登録
		testClass.SaveAsync();

	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

WEBでオブジェクト確認するけど,WEBの方は更新がかなり遅い,,,

スクリプトで親子付けをする

スクリプトであるオブジェクトの子にするスクリプトです

 

using UnityEngine;
using System.Collections;

public class test2 : MonoBehaviour {


	public GameObject maru1 ;//親のオブジェクトをアサインする
	public GameObject entyu;//子のオブジェクトをアサインする


	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}


	public void oyako(){
		entyu.transform.parent = maru1.transform;//entyuの親はmaruです

		entyu.transform.position = maru1. transform.position;
		entyu.transform.rotation = maru1.transform.rotation;
		//entyu.transform.position = new Vector3 (2, 2, 2);//これは移動
		entyu.transform.rotation = new Quaternion(10, 10, 5, 4);//これは回転
	}
}

 

Unityで画像認識(Google API使用)

AIがらみで調べていて,Google Cloud Vision APIが使えそうでした.

ちなみにCloud Visionとは

 

Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話 – Qiita

(この記事はGoogle Cloud Platform Advent Calendar 2015の12月3日分の記事です) Cloud Vision APIと私 Googleに入ってからまもなく5年、Google Cloud Platformのデベロッパーアドボケイト(エバンジェリストみたいな役割)の仕事に就いてから1年が経ちました。仕事の半分はアジア地域向けの開発者コミュニティ支援で、残り半分はGCPの新製品ローンチの支援をグローバル向けに行っています。 特に…” name=”description

LINK: qiita.com/kazunori279/items/768c7fdf96cdf45a9d16

 

 

このように顔の検出や,その顔のスマイル度,文字認識,写真なら何が写っているかなどを情報にして返してくれます.

ふーん,Unityだったらカメラ(WebCamTextureでUSBカメラも,スマホのカメラも使用できる)が使えるので,Unityで使えたらいいなぁ,,,ってふと検索したら,,

 

UnityからGoogle Cloud Vision APIを使ってみた |

前回の更新から1年ぶり(!)でtokyoZデビューすることになりました。どうぞよろしくお願いします。私は日頃から好んでUnityを使っておりまして、ゲームだけでなくインスタレーション、CE機器のUI、そして医療用のビュー前回の更新から1年ぶり(!)でtokyoZデビューすることになりました。どうぞよろしくお願いします。   私は日頃から好んでUnityを使っておりまして、ゲームだけでなくインスタレーション、CE機器のUI、そして医療用のビューワーなど、そのとどまるところを知らない可能性には日々感心させられておりま

LINK: tokyoz.koozyt.com/?p=1436

 

 

作ってくれてる方がいました!

素敵!

デモを見ると顔認識ができそうです.文字認識などは自分でリクエストコードかけばいいか,,,=>入ってます!!

ということで,さっそくダウンロード.

Unityのプロジェクトになっているのでプロジェクトをインポートして,,

APIキーをゲットして,,

あれ,,動かない,(400が出る)

APIキーが有効になるまで最大5分かかるのね,,

動かない,,,,(400)

あ,,APIキーの最後に半角スペースが入ってた(てへぺろ)

動かない,,,,(40以下略)

サーバ版でなくブラウザ版にしてみよう

動かない,,,,(4以下略)

もういっかいAPIキーをコピペして,,,ん?APIキーの1文字目の前にも半角スペースが,,,これを取り除いて,,

動きました!!

顔認識モードにします.で,満面の笑顔をした結果Googleの判定は!?=>VERY_UNLIKELY(意訳:おま,超不幸そうな顔!)

これは理系のエンジニアが悪いことにします.決して私の顔が悪いわけではない!!

ペットボトルを見せてみると,,

soutyou1

C中京大学って認識されています

soutyou2

裏のラベルを見せてみると,

“locale”:”ja”,”description”(日本語ですね,その内容は)と書かれています

で,認識したのが,

e50(),:/\u003e非加非加熱軟水B+t科名★(Eボ賞味期限ボトル側面に記載ars方法直射日光高温多湿の觀を避けて保存してくださ長良川名t株式会社:岐阜県関市APm29%水一地,岐阜県anan養成分10hLAC+)】エネルギーaKLr質脂質炭水化物カルシウム100gカムi-o名名量11

この距離ではよく認識したほうではないでしょうか?

さてこれをどう使うか?がとても重要ですね.

VRに使ったスクリプト(Unity側)

(関連記事)

  • VRについての記事はこちら
  • SerialHandlerについての記事はこちら

上記リンク先の記事SerialHandlerを使ったUnityの制御です.

 

using UnityEngine;
using System.Collections;
using System;//use for time
using UnityEngine.UI;//use for UI


//アセットSuperSplinesのメニューを追加
	[AddComponentMenu("SuperSplines/Animation/Regular Animator")]


	public class mySpline2 : MonoBehaviour{
		public Spline spline;
		public WrapMode wrapMode = WrapMode.Clamp;//SuperSplineの初期モード実際はLOOPで使用
		public float speed = 0f;//初期速度ゼロでないと起動したら動いてしまう
		public float offSet = 0f;//オフセット値/スタート位置を変えたい場合など.

		public float passedTime = 0f;//何に使ったかな?
	float myspeed = 0f;//何に使ったかな?

		public Text myText; //UIで使う用
		public SerialHandler serialHandler;//serialHandlerスクリプトがアサインされたゲームオブジェクトをアサインする用.

		//for arduino
		public bool spBool = false;//停止用

		//時間計算用,試行錯誤してるので要らない変数あるかも
		private int starttime;
		private int now;
		private int duration;
		private float truespeed;
		private float myPos = 0f;
		private float mytime = 0f;
		float lerpspeed =0f;
	float firstSpeed = 0f;

	float mymillsec= 0f;
	string kmspeed;



	void Start(){

			myText.text = "0km/h";//GUI表示用に0km/hいれる
		starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;//起動した時間をstarttimeにミリセカンドで入れる.ペダル停止検知用
		//信号を受信したときに、そのメッセージの処理を行う
		serialHandler.OnDataReceived += OnDataReceived;
		}



		void Update( ) {
			mytime += Time.deltaTime * speed;//いまの時間とスピードかけてspline動かす指標にする
		if (spBool) {//ペダル動いてるとき
		myPos += Mathf.LerpUnclamped (speed ,firstSpeed, mytime);//スプライン上の位置myPosを時間でslerpする
		}
		if (Input.GetKeyDown ("s")) {//停止用
			myPos += Mathf.LerpUnclamped (0f, 0f, mytime);
				spBool = false;
			myspeed = 0f;
		}

			if (Input.GetKeyDown ("r")) {//リセット用
				myPos = 0;
				spBool = true;
				myspeed = 0f;
			speed = 0f;
			}
// 下3行がsplineを動かすやつ
			float clampedParam = WrapValue (myPos + offSet, 0f, 1f, wrapMode);
			transform.position = spline.GetPositionOnSpline (clampedParam);
			transform.rotation = spline.GetOrientationOnSpline (clampedParam);

////
		}



	void OnDataReceived(string message){//arduinoから文字列を受信したら
		
		firstSpeed = speed;初期速度をさっきの速度に入れ替え(2回目以降用)
		mymillsec = float.Parse (message);//車輪が1回転した間隔を受信してるので,それをフロート値に変換
			myspeed = (3600000f / mymillsec) * 0.000628f;//速度km/hを計算
		if (myspeed < 0.9) {//速度が1km未満ならゼロに
			myspeed = 0f;
		}

			kmspeed = myspeed.ToString ("N2");//小数点2桁でカット
		speed = myspeed * 0.00005f;//乗数で速度感変わります
		//}
	
		myText.text = kmspeed + "km/h";//速度をUIに表示
		//以下使ってない(タブでデータ区切り用)
		var data = message.Split(
			new string[]{"\t"}, System.StringSplitOptions.None);
		if (data.Length < 2) return;

		try {
		} catch (System.Exception e) {
			Debug.LogWarning(e.Message);
		}

	}



	public void stopper(){ //使っていません.ペダルの回転間隔を調べて回っていないのならゼロにしようと思いましたが,惰性で進むことを優先してこちらはカット(ただしBoolだけ使ってる)
		now = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
		duration = now - starttime;

		if (duration > 3000) {
			spBool = false;
			kmspeed = "0";
			myText.text = kmspeed + "km/h";
		} else {
			spBool = true;
		}
		//Debug.Log (spBool);
		starttime = DateTime.Now.Hour * 60 *60 * 1000 + DateTime.Now.Minute * 60 * 1000 + DateTime.Now.Second * 1000 + DateTime.Now.Millisecond;
	}



	public void testBtn(){//センサを使っていないときに,GUIのボタンでテスト出来るよう

		int myrand = UnityEngine.Random.Range (150, 1800);
		string randStr = myrand.ToString ();
		OnDataReceived (randStr);


	}



//splineのモード設定用みたい
		private float WrapValue( float v, float start, float end, WrapMode wMode )
		{
			switch( wMode )
			{
			case WrapMode.Clamp:
			case WrapMode.ClampForever:
				return Mathf.Clamp( v, start, end );
			case WrapMode.Default:
			case WrapMode.Loop:
				return Mathf.Repeat( v, end - start ) + start;
			case WrapMode.PingPong:
				return Mathf.PingPong( v, end - start ) + start;
			default:
				return v;
			}
		}

	}

です.

VRアプリ開発メモ

実質2日間でOculusRift(DK2)対応のコンテンツを作っていました.

このレベルなら文系の私でもモデリング含めて2日(徹夜なし)で作れるので,卒研とかはこんなレベルじゃダメですよ〜

(ていうか,そもそも組み立てただけで研究でもなんでもない,,,)

そもそもOculusって何かってっつーと,PSVRのようなものです.

 

Oculus Riftはコケられない、だから値段も高くなる|WIRED.jp

製品版「Oculus Rift」の予約受付がはじまり、その価格の高さに驚いた人も多いだろう。しかしソニーやHTCといった手ごわいライヴァル企業と競わなければならないOculusにとって、いちばんの問題はその価格ではないようだ。

LINK: wired.jp/2016/01/11/oculus-rift-price/

 

このOculus社がDK1を出したのはずいぶん前です.当時は衝撃でしたね.私はジェットコースターで酔ってOculusは触らないことにしました.

でもこのあたりの衝撃が現在のVRブームを作ったとも言えます.

さて,このVRコンテンツ,作るのは超簡単です.

どのくらい簡単かというと,ドライバなどインストールしてれば,見るだけなら3分くらいで作れます.

研究室に前の住人が残しておいたエアロバイクがあったので,ちょいと分解.データが取れそうでした.

そこで,,,,

Arduinoでちょいちょいといじって,

bike1

こんなものができました.

八事の空を空中散歩♪

オーキャンで高校生が絶叫していました〜(それを見てる方が楽しい)

bike2

センサのデータ変換にはAruinoを使っています.

 

今回書いたプログラムは全部で200行以下です.

そのうち,エアロバイクのセンサをArduinoからシリアルで送るプログラム

unsigned long mytime = 0;
unsigned long hittime;
unsigned long duration;
boolean sensorBool = true;
int input_value;

void setup(){
Serial.begin(9600);
mytime = millis();
}


void loop(){
 input_value = analogRead(3);
if(sensorBool == true){
if(input_value < 200){
 sensorBool = false;
hittime = millis();
duration = hittime - mytime;
mytime = hittime;
send();
}
}else if(!sensorBool){
  if(input_value > 500){
    sensorBool = true;
  }
}
  
}

void send(){
Serial.println(duration);

}

これをUnityに送って,コースのスプラインを走るだけです.

うん,簡単ですね.

Unity側のプログラムは別記します

なお,数値変化をやさしくするために,

Mathf.LerpUnclamped

を使っています.

Mathf.Lerpでもいいのですが,これは0から1でしか動作しません.

Splineは0(始点)から1(終点)で動くので,1を入れると1周します.Mathf.Lerpですと,1周しかしません.

Mathf.LerpUnclampedにすると,1を越えても数値補完してくれるので2周3周したいお客さんがいるときにも対応できます.

もちろん,適宜データのリセットは大事ですが,,