Unity3D のスクリプト作成を検討しており、グローバルな例外処理システムをセットアップしたいと考えています。これは、ゲームのリリース バージョンで実行するためのものではありません。意図は、ユーザー スクリプトとエディター スクリプトの例外をキャッチし、それらが分析のためにデータベースに転送されることを確認することです (また、関連する開発者に電子メールを送信して、シズルを修正します)。
通常の C# アプリでは、Main メソッドの周りに try-catch があります。WPF では、未処理の例外イベントを 1 つ以上フックします。ユニティで…?
これまでのところ、私が思いついた最高のものは次のようなものです:
using UnityEngine;
using System.Collections;
public abstract class BehaviourBase : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
try
{
performUpdate();
print("hello");
}
catch (System.Exception e)
{
print(e.ToString());
}
}
public abstract void performUpdate();
}
他のスクリプトでは、MonoBehavior の代わりに BehaviourBase を派生させ、Update() の代わりに performUpdate() を実装しています。Editor クラスの並列バージョンを実装していませんが、同じことを行う必要があると思います。
ただし、コミュニティから取得したスクリプトにバックポートする必要があるため、この戦略は好きではありません (そして、チームに強制する必要があります)。エディター スクリプトには、MonoBehavior に匹敵する単一のエントリ ポイントもありません。そのため、ウィザードやエディターなどの例外セーフ バージョンを実装する必要があると思います。
Application.RegisterLogCallbackを使用して (例外ではなく) ログ メッセージをキャッチすることについての提案を見てきました が、実際の例外やスタック トレースにアクセスするのではなく、デバッグ ログ文字列を解析する必要があるため、これは不快です。
それで...どうするのが正しいのですか?