ゲームがシャットダウンするときにオブジェクトがコールバックを登録できるように、Game クラスに Register Callback メソッドがあります。
public void RegisterAsyncShutdownCallback(Func<Task> callback)
{
if (this.asyncShutdownCallbacks.Contains(callback))
{
return;
}
this.asyncShutdownCallbacks.Add(callback);
}
ゲームがシャットダウンしたら、コールバックを呼び出します。
public virtual async Task ShutdownGame()
{
var callbackTasks = new List<Task>();
foreach (var callback in this.asyncShutdownCallbacks)
{
callbackTasks.Add(callback());
}
// Invoke all of the asynchronous callbacks first.
await Task.WhenAll(callbackTasks);
}
私の質問は、モンスターが死ぬか、アイテムが null に設定されたなどの理由で、これらのコールバックのいずれかの所有者が null になった場合はどうなるかということです。コールバック所有者への強い参照を保持していますか? もしそうなら、登録解除メソッドを提供する方が良い方法ですか、それとも WeakReference でラップする必要がありますか?
エンジンはイベントの代わりにコールバックを使用しているため、プレイヤー、モンスター、バトル コードなどで非同期操作を実行できます。そのため、多くのオブジェクトにはこの RegisterCallback スタイルのメソッドがあり、オブジェクト内で特定のイベントが発生したときにコールバックを呼び出します。強い参照を保持している場合は、オブジェクトの適切な登録解除に依存するよりも、弱い参照を保持して自己クリーンアップすることを好みます。エンジンは、サードパーティのユーザーがプラグインを作成してコールバックを登録できるようにする API を提供します。エンジン自体で制御できるのであれば、開発者がオブジェクトを適切に登録解除することに依存したくありません。