私はUnity3Dでゲームを書いています。私はWebリクエストの代理人ではなく、イベントや他の構造を完全に使うべきかどうか疑問に思っています。デリゲートコールバック内で削除された状態のオブジェクトに対する保護
ゲームのライフサイクルの特定の時点で、REST APIを呼び出してレスポンスを待つ必要があります。あなたの友人のリストを取得し、各友人のエントリと共に、友人の数を表示するUI画面を考えてみましょう。現在、ワークフローは私のServer
クラスのさまざまなメソッドのパラメータとしてAction
デリゲートを使用して、次のようになります。
Server.GetFriends
方法は、私たちのREST APIへのHTTPリクエストを行いレスポンスを取得し、デリゲートを呼び出します
class FriendsUI : MonoBehaviour
{
[SerializeField]
private Text friendCount; // A Unity Text component
private void OnStart()
{
Server.GetFriends(player, response => {
ShowFriendList(response.friends);
});
}
private void ShowFriendList(List<Friend> friends)
{
this.friendCount.text = friends.Count.ToString();
// Display friend entries...
}
}
応答と制御をFriendsUI
に返します。
これは通常正常に動作します。しかし、デリゲートが呼び出される前に友人のUI画面を閉じた場合、そのコンポーネントの - とそのクラス内の他のコンポーネントはすべて破棄され、NPEがアクセスしようとするとスローされます。
これを知っていれば、C#のイベントシステムはこれのためのより良い設計と思いますか? Server
はFriendsEvent
イベントのようなものを公開し、FriendsUI
はそれを購読します。 Server
が応答を検証/変換した時点で、イベントが発生します。また、FriendsUI
は、それ自身の後にクリーンアップし、スクリプトが添付されたGameObjectが破棄されたときにハンドラの登録を解除する。こうすれば、イベントがServer
に発生した時点で、イベントハンドラがFriendsUI
で有効でなくなった場合、それは呼び出されません。
私はそれを実装する前に、私の頭の中でこれを実行しようとしています。なぜなら、やや大きなリファクタリングになるからです。私は、人がそれが良い道だと思うかどうか、他に良いルートがあるかどうか、道に沿って陥る可能性のある落とし穴があるかどうかについてのガイダンスを探しています。
ありがとうございます。
UnityEventを使うことを学ぶ。それは容易ではありません。 http://stackoverflow.com/a/36249404/294884 – Fattie
Joeさん、ありがとうございます。 UnityEventシステムは、過度に冗長なようですが、それはおそらく行く方法です。例えば、私が考えているように、 'UnityEvent'を拡張した 'Server'クラスに' FriendsResponseEvent'クラスを公開する必要があります。また、 'Server'の' FriendsResponseEvent'プロパティを宣言してインスタンス化する必要があります。次に、私の 'FriendsUI#OnStart'メソッドに' Server.FriendsResponseEvent.AddListener(ReceivedFriends) 'を追加します。このパターンは、 'Server'が発生させようとしているすべてのイベントで発生する必要があります。それとももっと簡潔な方法がありますか? –
Monkey34
テストでは、(1)サーバクラスに 'public UnityEvent teste;'と入力します。 (2)そのクラスのどこかで(例、接続が完了したら) 'teste.Invoke()'に行きます。最後に、(3)サーバークラスのInspectorを確認します。今すぐあなたが "テストする"(あなたがそのようにしたい数だけ接続する)ものをDRAGしてください。 – Fattie