私の利用しているシャープのAndroidタブレット「SH-08E」は、加速度センサー、地磁気センサー、ジャイロの各センサーを持っています。Unityでは簡単にこのセンサーデータを取得して、オブジェクトの動きをセンサーで制御できます。
センサー情報表示用Scene
センサーからのデータにより、作成したCubeを制御します。「Hierarchy」→「Create」→「Cube」からCubeを作成し「Hierarchy」→「Create」→「Directional Light」で光を当てます。その他、Cubeに色を付けるために、「Project」→「Create」→「Material」から色を選択して、作成したMaterialをCubeにドラッグします。
また、「GameObject」→「Create Empty」によりダミーのオブジェクトを作成し、読み出したセンサー情報をこのオブジェクトに表示します。C#によりスクリプトを作成するため、InspectorのscriptにC#スクリプト「InputCheck」をドラッグして、次のように設定します。
Androidタブレットのセンサー情報の表示
作成したダミーのオブジェクトに次のスクリプト「InputCheck.cs」を設定し、加速度センサー、地磁気センサー、ジャイロの各センサーデータを画面に表示します。Androidタブレットを動かすことにより、そのセンサーデータをリアルタイムに数値表示します。テキストの表示はコールバック関数「OnGUI」に記述し、GUI.Labelを用いて取得したセンサーデータを表示しますます。なお、各センサーの入力は次のメソッドにより行います。
- 加速度センサー:Input.acceleration
- 地磁気センサー:Input.compass
- ジャイロ:Input.gyro
スクリプトを次に示します。
InputCheck.cs
using UnityEngine; using System.Collections; public class InputCheck : MonoBehaviour { private Vector3 acceleration; private Compass compass; private Quaternion gyro; private GUIStyle labelStyle; void Start() { //フォント生成 this.labelStyle = new GUIStyle(); this.labelStyle.fontSize = Screen.height / 22; this.labelStyle.normal.textColor = Color.white; Input.compass.enabled = true; Debug.Log(string.Format("<b>精度</b>:{0}", Input.compass.headingAccuracy)); Debug.Log(string.Format("<b>タイムスタンプ</b>:{0}", Input.compass.timestamp)); Input.gyro.enabled = true; } void Update() { this.acceleration = Input.acceleration; this.compass = Input.compass; this.gyro = Input.gyro.attitude; } void OnGUI() { if (acceleration != null) { float x = Screen.width / 10; float y = 0; float w = Screen.width * 8 / 10; float h = Screen.height / 20; for (int i = 0; i < 12; i++) { y = Screen.height / 10 + h * i; string text = string.Empty; switch (i) { case 0://X text = string.Format("accel-X:{0}", this.acceleration.x); break; case 1://Y text = string.Format("accel-Y:{0}", this.acceleration.y); break; case 2://Z text = string.Format("accel-Z:{0}", this.acceleration.z); break; case 3://X text = string.Format("comps-X:{0}", this.compass.rawVector.x); break; case 4://Y text = string.Format("comps-Y:{0}", this.compass.rawVector.y); break; case 5://Z text = string.Format("comps-Z:{0}", this.compass.rawVector.z); break; case 6://Z text = string.Format("magneticHeading:{0}", this.compass.magneticHeading); break; case 7://Z text = string.Format("trueHeading:{0}", this.compass.trueHeading); break; case 8://Y text = string.Format("gyro-x:{0}", this.gyro.x); break; case 9://Y text = string.Format("gyro-y:{0}", this.gyro.y); break; case 10://Y text = string.Format("gyro-z:{0}", this.gyro.z); break; case 11://Y text = string.Format("gyro-w:{0}", this.gyro.w); break; default: throw new System.InvalidOperationException(); } GUI.Label(new Rect(x, y, w, h), text, this.labelStyle); } } } }
センサーデータによるCubeの位置制御
次のCubeの位置制御用のスクリプト「cube.cs」には、加速度センサー、地磁気センサー、ジャイロの各センサー情報をCubeに割り付ける処理が含まれ、いずれかの情報のみ有効にし、その他のスクリプトはコメントにしています。下記のコードはジャイロセンサーデータを有効にしています。
- 加速度センサー:26-39行目を有効にする
- 地磁気センサー:42行目を有効にする
- ジャイロ:45行目を有効にする
スクリプトを次に示します。
cube.cs
using UnityEngine; using System.Collections; public class cube : MonoBehaviour { private Vector3 acceleration; private Compass compass; private Quaternion gyro; // Use this for initialization void Start() { Input.compass.enabled = true; Input.gyro.enabled = true; Debug.Log("start! cube"); } // Update is called once per frame void Update() { this.acceleration = Input.acceleration; this.compass = Input.compass; this.gyro = Input.gyro.attitude; //// 加速度センサを利用してCubeを移動 //float speed = 5.0f; //var dir = Vector3.zero; //dir.x = Input.acceleration.x; //dir.y = Input.acceleration.y; //if (dir.sqrMagnitude > 1) //{ // dir.Normalize(); //} //dir *= Time.deltaTime; //transform.Translate(dir * speed); //地磁気センサーから値を取得 //transform.rotation = Quaternion.Euler(0, -Input.compass.trueHeading, 0); // ジャイロセンサの値を取得し、Unity内のカメラと同期 this.transform.localRotation = Quaternion.Euler(90, 0, 0) * (new Quaternion(-gyro.x, -gyro.y, gyro.z, gyro.w)); // Cubeの位置を任意の位置に変更 //Vector3 pos = transform.position; //pos.x = 0.5f; //transform.position = pos; //Debug.Log(transform.position); //// OK //transform.position = new Vector3( // -4, // -1, // 5); } }
ジャイロセンサの値によりCubeの制御
「Unity で Bundle Identifier の設定とアンドロイド端末での実行」に従って、アンドロイド端末用にゲームソフトをビルドし、Androidタブレット「SH-08E」にダウンロードします。ゲームソフトが実行されると、タブレットを回転するとCubeも同様に回転し、タブレットを傾けるとCubeも同様に傾きます。
加速度センサーの値によりCubeの制御
タブレットを傾けると、傾けた方にCubeが移動し、傾けたままにすると、Cubeが画面から徐々に消えていきます。