背景
- 実機にて、移動しながら内部数値を見たり、エラーログを確認したい
- 通常の開発のように、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 にした