中級 プログラマー
Log クラスを使うと、ゲームの実行中に、ゲームに関する情報をログに記録することができます。
自動的に情報を取得するプロファイリングとは異なり、独自のログメッセージを作成し、それをいつトリガーするかを決めるのはあなた自身です。例えば、キャラクターが特定のアクションを行ったときにトリガーされるログメッセージを作成することができます。これは、ゲームのパフォーマンスを調査するのに役立ちます。
[!Note] リリースモードでゲームをビルドすると、ログの記録が無効になります。
ロギングを使用し、デバッグモードでゲームを実行すると、Stride は、ロギング情報を表示する 2 つ目のウィンドウでコンソールを開きます。メッセージは、レベルごとに色分けされます。 モジュールの名前(ログメッセージを含むスクリプトなど)が、かっこ内に表示されます。続いてログレベル(Warning, Error など)、そしてログメッセージが表示されます。
コンソールには、自分のスクリプトだけでなく、すべてのモジュールからのログメッセージが表示されます。例えば、@'Stride.Core.Serialization.Contents.ContentManager' からのメッセージも表示されます。
Visual Studio からゲームを実行した場合、ログメッセージは、代わりに Visual Studio の出力ウィンドウに表示されます。
ログメッセージには 6 つのレベルがあり、重大度に応じて使い分けられます。
| ログレベル | 色 | 説明 |
|---|---|---|
| Debug | 灰 | 高度なデバッグを目的としたステップバイステップの情報 |
| Verbose | 白 | 詳細情報 |
| Info | 緑 | 一般的な情報 |
| Warning | 黄 | 問題を引き起こすかもしれないマイナーなエラー |
| Error | 赤 | エラー |
| Fatal | 赤 | ゲームをクラッシュさせる深刻なエラー |
既定では、ログは Info レベル以上のメッセージを表示します。つまり、既定では Debug, Verbose のメッセージは表示されません。これを変更するには、後述する 最小レベルの設定 を参照してください。
ログを出力したいコードが含まれるスクリプトで、次のように記述します。
Log.Debug("My log message");
Debug の部分を、ログメッセージに使用するレベルで置き換えることができます(先述の ログレベル を参照)。
これを if 文と組み合わせることで、特定の条件を満たしたときにメッセージをログに残すことができます(後述する サンプルスクリプト を参照)。
ログに出力する最小のレベルを設定することができます。例えば、Warning 以上の厳しいメッセージだけを表示したい場合は、次のようにします。
Log.ActivateLog(LogMessageType.Warning);
[!Note] これはグローバルな設定ではありません。設定したログレベルは、設定したスクリプトでのみ適用されます。
((Game)Game).ConsoleLogLevel = LogMessageType.myLogLevel;
GlobalLogger.GetLogger("RouterClient").ActivateLog(LogMessageType.Debug, LogMessageType.Fatal, false);
// RouterClient モジュールのロギングを無効化
// Disables logging of the RouterClient module
((Game)Game).ConsoleLogMode = ConsoleLogMode.None;
ログ出力をテキストファイルに保存するには、Start メソッドに以下のコードを追加します。
var fileWriter = new TextWriterLogListener(new FileStream("myLogFile.txt", FileMode.Create));
GlobalLogger.GlobalMessageLogged += fileWriter;
これにより、プロジェクトの Debug フォルダにファイルが作成されます。(例:*MyGame\MyGame\Bin\Windows\Debug\myLogFile.txt*)
次のスクリプトは、MyTexture テクスチャーが読み込まれたかどうかを確認する例です。
テクスチャーが読み込まれたとき、ログはデバッグメッセージ(Log.Error)を表示します。
読み込まれなかったときは、ログはエラーメッセージ(Log.Debug)を記録します。
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Stride.Core.Diagnostics;
using Stride.Core.Mathematics;
using Stride.Input;
using Stride.Engine;
using Stride.Graphics;
namespace MyGame
{
public class Script : SyncScript
{
public Texture myTexture;
public override void Start()
{
// Initialization of the script.
Log.ActivateLog(LogMessageType.Debug);
Log.Debug("Start loading MyTexture");
myTexture = Content.Load<Texture>("MyTexture");
if (myTexture == null)
{
Log.Error("MyTexture not loaded");
}
else
{
Log.Debug("MyTexture loaded successfully");
}
}
}
}