背景
- 実機にて、移動しながら内部数値を見たり、エラーログを確認したい
- 通常の開発のように、Canvas の RenderMode を ScreenSpace にしてもダメ
- RenderMode を WorldSpace にして、UI をカメラ追従させる必要がある
結論
- NRDemo の Input-ControllerInfo の ControllerInfoDisplayUI をコピペして改修
方法
まずはテキスト表示
Nrealアプリ開発前に NRSDK の Demo に触っておく にて、ヘッドセットを移動・回転させても視界に必ずUI(数値表示)が付いてくるデモが唯一ある。
それが Input-ControllerInfo。
ヒエラルキーの ControllerInfoDisplayUI をコピーして、自分のシーン以下(例:SampleScene)にコピペして使用する。
ControllerInfoDisplayUI には ControllerInfoDisplayUI.cs がアタッチされているが、HeadsetFollower.cs など別途スクリプトを用意してアタッチする。
(NRSDK 側はできるだけ修正しないのがよい。修正するとSDK更新時に上書きされてしまったり、管理が面倒になるため)
エラーログ表示
どこかの MonoBehaviour にて、以下のようなコードを書けばよい。
private void Awake() { Application.logMessageReceived += onLogMessageReceived; } private void onLogMessageReceived(string condition, string stackTrace, LogType type) { string msg = string.Empty; Color color = Color.red; string crlf = System.Environment.NewLine; if (type == LogType.Error || type == LogType.Assert || type == LogType.Exception) { condition = modifyString(condition); stackTrace = modifyString(stackTrace); msg = $"{condition}{crlf}{stackTrace}{crlf}"; color = Color.red; } else if (type == LogType.Warning) { // [Warning][NativeTrack] は無視(実機で出力される) if (!condition.Contains("[Warning][NativeTrack]")) { condition = modifyString(condition); stackTrace = modifyString(stackTrace); msg = $"{condition}{crlf}{stackTrace}{crlf}"; color = Color.yellow; } } else { // 通常ログは表示しない(表示させたい場合はコメントアウトを外す) //msg = $"{condition}{crlf}{crlf}"; } if (msg != string.Empty) { var logObject = GameObject.Find("maininfoTxt").GetComponent<UnityEngine.UI.Text>(); logObject.text += msg; logObject.color = color; } } private string modifyString(string str) { // 改行コードが無い場合は、max文字数で改行コードを追加 var ret = string.Copy(str); if (countChar(str, "\n") == 0) { int max = 160; if (str.Length > max) { ret = str.Insert(max, System.Environment.NewLine); } } return ret; }
エラー発生時には以下のように表示される。
実機でもこのように表示されて原因がすぐにわかるので、開発速度が上がる。
備考
- 当初は自前でテキストをカメラ追従させようとしたが、UIサイズと文字サイズの調整が面倒だった
(3D空間で、適したサイズでテキスト表示させるのは結構難しい) - TextMeshProUI でも試したが、実機ではうまく表示されなかった(シェーダーの問題?)(参考:[unity]実機でログを表示)
- ControllerInfoDisplayUI では UIサイズや文字サイズが調整済なので、そこから微調整するのが正解だった
- エラーログは実機の画面全体に表示したかったので(文字数が多いので)、text のサイズは Width 3840, Height 1080 にした