実験室 » Android » この記事

UnityとAndroidを連携させBluetoothでArudinoと通信してみた(2)

前回からの続きになります。

 

最初に参考サイト(http://tokyo.supersoftware.co.jp/code/4807)と同じく、Unity側のユーザーインターフェースを作り変えます。元プログラムではONGUI()で、ボタンをスクリプトから作成しているわけですが、このイベントが発生する部分をスライダーに置き換えてしまいます。

 

GUIのパーツをペタペタ張り込んで作りました。キャプチャーはこんな感じ。

 

unity_01

 

スクリプトは以下の様に改編しました。(※書き出す時のパッケージ名ですが、ここではちゃんとhogeと打ち替えてますが(自分が作ったものは引用元サイトの名前のまま)、ここを自分みたいにいい加減に設定しちゃうと、後々困ったことになるので注意したいところ)

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices;
using System;

public class slide : MonoBehaviour {

	private Text rText;	// 格納用(タグを介してスライダーの右のテキストボックスに数値表示する為に用意した)
	private Text gText;	// 格納用
	private Text bText;	// 格納用

	private float r;	// RGB値の数値を持つ
	private float g;
	private float b;

	private Image panel;	// バネルを格納する

	// ★Bluetooth通信関連
	private IntPtr BluetoothTestActivityClass;
	private IntPtr ptr_onClickButton;


	void Start () {

		// バネルを取得しておく。
		panel = GameObject.FindWithTag("panel").GetComponent<Image>();


		Slider slider_r = GameObject.FindWithTag("slider_r").GetComponent<Slider> ();
		/*
		 * GetComponentで指定するのは、クラスの名称ではなく、型。(✕)Slider_R (○)Slider
		*/
		Slider slider_g = GameObject.FindWithTag("slider_g").GetComponent<Slider> ();
		Slider slider_b = GameObject.FindWithTag("slider_b").GetComponent<Slider> ();


		rText = GameObject.FindWithTag("text_r_value").GetComponent<Text> ();
		gText = GameObject.FindWithTag("text_g_value").GetComponent<Text> ();
		bText = GameObject.FindWithTag("text_b_value").GetComponent<Text> ();


		// ★Bluetooth通信を行うための追加設定
		AndroidJNI.AttachCurrentThread();
		IntPtr cls_Activity = AndroidJNI.FindClass("jp/co/hoge/unity/bluetooth/test/BluetoothTestActivity");
		Debug.Log("cls_Activity = " + cls_Activity);
		IntPtr fid_Activity = AndroidJNI.GetStaticFieldID(cls_Activity, "mBluetoothTestActivity", "Ljp/co/hoge/unity/bluetooth/test/BluetoothTestActivity;");
		IntPtr obj_Activity = AndroidJNI.GetStaticObjectField(cls_Activity, fid_Activity);
		BluetoothTestActivityClass = AndroidJNI.NewGlobalRef(obj_Activity);

		// ★java側で実行される関数onClickButtonに渡す引数の型のシグネチャをint型に。
		ptr_onClickButton = AndroidJNI.GetMethodID(cls_Activity, "onClickButton", "(I)V");		// 引数はI(int)で、戻り値の型は、V(void)

		jvalue[] jargs = new jvalue[1];		// 要素1の共用体を作成する。


		/* 赤(0~255) */
		slider_r.onValueChanged.AddListener((value)=>{
			// ラムダ式で直接表記

			jargs [0].i = (int)value;	// 単純にキャスト;
			AndroidJNI.CallVoidMethod(BluetoothTestActivityClass, ptr_onClickButton, jargs);	// 登録したjava(AndroidStudio)側の関数を実行する。


			//Debug.Log(value);	// この時のvalueは自動的にスライダからもらえる
			rText.text = value.ToString();	// float->string

			r = value / 256;
			// unityのcolor型が取る値の範囲は、0から1までの間なので、256段階に分割しなおさないと
			// http://shiro-izu.hateblo.jp/entry/2016/01/22/163858

			panel.color = new Color (r,g,b);	// 変化がある都度更新

			Debug.Log(panel.color);
		
		});

		/* 緑(256~511) */
		slider_g.onValueChanged.AddListener((value)=>{
			// ラムダ式で直接表記

			jargs [0].i = (int)value + 256;	// 値を256分ずらす。Arduinoで除去
			AndroidJNI.CallVoidMethod(BluetoothTestActivityClass, ptr_onClickButton, jargs);	// 登録したjava(AndroidStudio)側の関数を実行する。

			//Debug.Log(value);	// この時のvalueは自動的にスライダからもらえる
			gText.text = value.ToString();	// float->string

			g = value / (int)value;	// 単純にキャスト256;	// unityのcolor型が取る値の範囲は、0から1までの間なので、256段階に分割しなおさないと

			panel.color = new Color (r,g,b);	// 変化がある都度更新

			Debug.Log(panel.color);

		});

		/* 青(512~768) */
		slider_b.onValueChanged.AddListener((value)=>{
			// ラムダ式で直接表記

			jargs [0].i = (int)value + 512;	// 値を512分ずらす。Arduinoで除去
			AndroidJNI.CallVoidMethod(BluetoothTestActivityClass, ptr_onClickButton, jargs);	// 登録したjava(AndroidStudio)側の関数を実行する。

			//Debug.Log(value);	// この時のvalueは自動的にスライダからもらえる
			bText.text = value.ToString();	// float->string

			b = value /256;	// unityのcolor型が取る値の範囲は、0から1までの間なので、256段階に分割しなおさないと

			panel.color = new Color (r,g,b);	// 変化がある都度更新

			Debug.Log(panel.color);

		});

	}

	// 毎ターン
	void Update(){
	}


	// 外部から取得できるように
	public Color getRGBval(){

		Color rgbColor = new Color (r,g,b);

		return rgbColor;

	}

}

 

ONGUI()で処理していた内容が、一部不要になったり、他の場所に移動したりしています。スライダーが、発するイベントはonValueChangedだけだそうなので、これを検知したら、java側のptr_onClickButtonという名前の関数に、jargsという名前のint型の値が入っている共用体を渡すということを書きました。なお紐づけされる関数名ですが、ボタンクリックではなく、スライダーのタップなので本当は関数名も別の名前にするべきでしたが、参考サイトと比較しにくくなっちゃうので、関数名はこのまま同じでここでは使っています。(かっこ悪いけどまぁ、自分が把握しやすければいいやと)

 

また、JNI(Java Native Interface)については、(´・∀・`)ヘーこんな風にして値を渡すんだーと関心しているぐらいの初心者なので、無理にいじくりまわさないで、int型を素直に渡してます。これが配列を渡したり出来たらまた色々なことが出来そうな気がするんですが、実力が伴わないので諦めました。(・3・)ムリ

 

つつ゛く

コメントを残す

トラックバックURL:
http://haganenomori.net/wp/wp-trackback.php?p=2036