Unity公式のLoggingパッケージが使い勝手が良さそう

こんにちは、エンジニアの渡辺(@mochi_neko_7)です。

先日Unity 2022 LTSがリリースされたので触っていたのですが、ふとPackageをチェックしていたところ、 Unity公式のLoggingパッケージが存在することに初めて気が付きました。

しかもドキュメントやAPIを見てみる感じでは「こういうのが欲しかった」という印象で期待が持てそうでした。

自分でも少し触ってみたので、本記事ではこのUnity公式のLoggingパッケージを簡単に紹介します。

環境

  • Unity 2022.3.0f1
  • Unity Logging 1.0.11

Unity公式のLoggingパッケージ

いつの間にかUnity公式からLoggingのパッケージが提供されていました。

docs.unity3d.com

主な特徴を挙げるなら下記でしょうか。

  • 非同期Logging対応
  • UnityEngine.Debug より詳細なLogLevel
  • 構造化ログ(JSON)対応
  • ログの出力先のカスタマイズ
  • Burstによるパフォーマンスの最適化
    • ちゃんと追えていませんが、内部では[BurstCompile]のAttributeが至る所にあります

どれも高度なLoggingライブラリを使用・作成したことのある方なら欲しいと思う機能ではないでしょうか。

また、プロジェクトのニーズに合わせて細かい挙動をConfigurationでカスタマイズすることも可能です。

docs.unity3d.com

導入方法

Package ManagerのUnity Registryから「Logging」を検索してインストールしてください。

もしくは、ご自身のUnityProjectのPackages/manifest.json"dependencies"に下記を追加してください。

"com.unity.logging": "1.0.11",

バージョンは任意のものを指定してください。

使用方法

使用したいAssembly Definitionに下記3つの参照を追加します。

  • Unity.Logging
  • Unity.Burst
  • Unity.Collections

それから

Get started | Unity Logging | 1.0.11

using Unity.Logging;

public class UserLogger : MonoBehaviour
{
    void Awake()
    {
        Log.Info("Hello, {username}!", "World");
    }
}

にあるように、Log.XXX(message)XXX は使用するLogLevel)の形で呼び出して利用することができます。

Built-inのLoggingとの対応は一例ですが下記のようなイメージです。

  • Debug.Log(message) -> Log.Verbose(message) or Log.Debug(message) or Log.Info(message)
  • Debug.LogWarning(message) -> Log.Warning(message)
  • Debug.LogError(message) -> Log.Error(message) or Log.Fatal(message)

デフォルトのLogファイルの出力先は、EditorではLogsフォルダのOutput.log, Output.log.jsonのようです。

実機の出力先は全て確認できているわけではありませんが、Mac実機では通常のLogファイルの出力先とほぼ同じ、Library/Logs/<CompanyName>/<ProductName>/Logsフォルダのようです。

おそらくWindows、Android、iOSも同様だと思います。

まとめ

Unity公式のLoggingパッケージの簡単な紹介をしました。

特徴として下記を挙げたように、高度なLoggingライブラリとして欲しい機能をしっかり抑えているのではないでしょうか。

  • 非同期Logging対応
  • UnityEngine.Debug より詳細なLogLevel
  • 構造化ログ(JSON)対応
  • ログの出力先のカスタマイズ
  • Burstによるパフォーマンスの最適化

UPMで手軽に導入できる点も魅力的です。

他のLoggingライブラリ

UnityのLoggingライブラリを検索すると下記の情報が出てくるかと思います。

github.com

github.com

speakerdeck.com

zenn.dev

これらと比較しても公式パッケージの導入の手軽さのメリットがありますが、細かい仕様等異なる点もありますので参考にしていただければと思います。

おわりに

自分もまだまだ触り始めたばかりなのであまり深い話までできませんでしたが、使い勝手が良さげな雰囲気は伝わったかと思います。

もうUnityの標準のLoggingは使用せずに、すべてこちらの公式パッケージのLoggingに乗り換えるのもありかなと考えています。

今後はもう少し内部実装を追ってみたり、Configurationのカスタマイズを実際にやってみてその使い勝手も見られたらと思っています。

※2023/07/03追記

ちゃんとした原因は分かっていないのですが、非同期処理内でLog.Debugを使用するとメインスレッドが完全に止まって返ってこない場合がありました。

SyncModeをFullSyncにするとメインスレッドは返ってくるのですが、内部のエラーになってしまいました。

Burstのバージョンを 1.8.4 -> 1.8.7 に手動で上げたら改善されたのでBurstの不具合の可能性が高いですが、もし困った方がいたら参考にしてください。

"com.unity.logging": "1.0.11",
"com.unity.burst": "1.8.7",