ブログ

Nrealアプリで追従UIやエラーログを表示する方法

背景

  • 実機にて、移動しながら内部数値を見たり、エラーログを確認したい
  • 通常の開発のように、Canvas の RenderMode を ScreenSpace にしてもダメ
  • RenderMode を WorldSpace にして、UI をカメラ追従させる必要がある

結論

  • NRDemo の Input-ControllerInfo の ControllerInfoDisplayUI をコピペして改修

方法

まずはテキスト表示

Nrealアプリ開発前に NRSDK の Demo に触っておく にて、ヘッドセットを移動・回転させても視界に必ずUI(数値表示)が付いてくるデモが唯一ある。

それが Input-ControllerInfo。

Nreal_DisplayUI

ヒエラルキーの 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;
}

エラー発生時には以下のように表示される。
実機でもこのように表示されて原因がすぐにわかるので、開発速度が上がる。

Nreal_ErrorLog

備考

  • 当初は自前でテキストをカメラ追従させようとしたが、UIサイズと文字サイズの調整が面倒だった
    (3D空間で、適したサイズでテキスト表示させるのは結構難しい)
  • TextMeshProUI でも試したが、実機ではうまく表示されなかった(シェーダーの問題?)(参考:[unity]実機でログを表示
  • ControllerInfoDisplayUI では UIサイズや文字サイズが調整済なので、そこから微調整するのが正解だった
  • エラーログは実機の画面全体に表示したかったので(文字数が多いので)、text のサイズは Width 3840, Height 1080 にした

-ブログ

© 2022 墾田ええねん! Powered by AFFINGER5