コンパスアプリを作ってみようと思って調べてみると、UnityにCompassインターフェースというもがあったので、今回はそれを使った内容を書いてみました。
環境
Unity2018.3.0f2
Xcode10.1
Compassインターフェース
enabled | コンパスを有効または無効にするために使用します。Input.compass.trueHeadingプロパティーに有効な値を含ませたい場合、Input.location.Start()を呼び出してロケーションの更新を有効にする必要があります。 |
headingAccuracy | 度単位の方向読み取りの精度 |
magneticHeading | 磁北極に基づく度単位の進行方向 (読み取り専用) |
rawVector | マイクロテスラ単位の raw 地磁気データ (読み取り専用) |
timestamp | 進行方向が最後に更新されたときのタイムスタンプ (1970 以来の秒数)。(読み取り専用) |
trueHeading | 地理的北極に基づく度単位の進行方向 (読み取り専用) |
実装
色々変数があるので、とりあえず画面に情報を出すだけのプログラムを書いてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Compass : MonoBehaviour { void Start() { Input.compass.enabled = true; Input.location.Start(); } void OnGUI () { var sb = new System.Text.StringBuilder(); sb.Append( "Enabled :").AppendLine( Input.compass.enabled.ToString() ); sb.Append( "headingAccuracy:").AppendLine( Input.compass.headingAccuracy.ToString() ); sb.Append( "magneticHeading:").AppendLine( Input.compass.magneticHeading.ToString() ); sb.Append( "rawVector :").AppendLine( Input.compass.rawVector.ToString() ); sb.Append( "timestamp :").AppendLine( Input.compass.timestamp.ToString() ); sb.Append( "trueHeading :").AppendLine( Input.compass.trueHeading.ToString() ); GUI.Label( new Rect( 10, 10, 256, 256 ), sb.ToString() ); } } |
iPhoneに転送した画面がこちらです。端末を傾けると数字が変化していました。正しく動作してそうです!

次にUGUIのTextを使って東西南北と角度を表示してみました。階層はこんな形です。

trueHeadingの値を使って、Rootオブジェクトを回転させる処理がこちらです。
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 |
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Compass : MonoBehaviour { [SerializeField] private RectTransform m_root; [SerializeField] private Text m_trueHeading; void Start() { Input.compass.enabled = true; Input.location.Start(); } void Update () { m_root.rotation = Quaternion.Euler(0, 0, Input.compass.trueHeading); m_trueHeading.text = ((int)Input.compass.trueHeading).ToString() + "°"; } } |
端末実行したものがこちらです。
実際に動かしてみると表示がカクついていたので、targetFrameRateを60に設定し、見た目も調整して最終的にはこんな感じにしてみました。
まとめ
既にUnityで提供されているインターフェースがあり、ネイティブコードを書かなくても作ることができました。素材もUGUIのデフォルト素材を使うことで時間短縮もできあっという間にコンパスアプリが作れました!!