イベントシステムとは何か、それを作る方法に飛び込む前に、最初にイベントシステムを持つことがなぜ有用であるかを議論しましょう。Unityでは、別のクラスからデータまたは依存関係を取得するために、以下の2つのいずれかに依存します。
あなたは、
あなたのpublicまたはserializedプロパティをMonobehaviourに束ねて、インスペクタからそれを割り当てて参照を取得できるようにします。
または
必要なデータを取得するには、コード内でシングルトンパターンを使用します。
シングルトンの設計パターンをまだ認識していない場合、クラスのインスタンス化を単一のインスタンスに制限するソフトウェア設計パターンです。 これは、システム全体でアクションを調整するために正確に1つのオブジェクトが必要な場合に便利です。
コード内の別のオブジェクトがそのオブジェクトのデータを必要とする場合は、シングルトンインスタンスを呼び出して参照します。 シングルトンは、そのインスタンスを1つだけ必要とすることがわかっているクラスを参照するのに非常に便利です。
依存関係を取得するためにどのようなアプローチを使用するかにかかわらず、小さなものを微調整したり、コードをリファクタリングしたりするとき、特に非常に大規模なプロジェクトで作業している場合に問題に直面するでしょう。
依存関係を緩和しよう!
イベントシステムは、互いに直接知らないクラス間でメッセージを送信することによって、コードをモジュール化するのに役立ちます。 これらは、更新ループで常に監視することなく、状態の変更に対応することを可能にします。 これは、subjectと呼ばれるオブジェクトが、observerと呼ばれるその依存関係のリストを維持し、通常はそのメソッドを呼び出すことによって、状態の変更を自
これを雑誌購読の例で理解しましょう。
- 雑誌出版社(件名)が営業しており、雑誌(データ)を発行しています。
- あなた(データ/オブザーバーのユーザー)が購読(登録)した雑誌に興味があり、新しい版が出版された場合、それはあなたに配信されます。
- 退会(登録解除)すると、新しいエディションの取得を停止します。
- 出版社は、あなたが誰であり、あなたが雑誌をどのように使用するかを知らない、それはあなたが購読者であるため、あなたにそれを提供するだけです(疎結合)。
イベントシステムを設計するには?
私はThirdPersonControllerプレーヤー(X氏など)、迷路、いくつかのドアを持っているシーンがあります。 さて、氏を言ってみましょう。 Xは迷路の出口に到達したいが、すぐに氏Xがそれらの近くに達するように開くことができる間にいくつかのドアがあります。
ドアには、この衝突に関与する他の衝突型加速器をトリガするトリガボックス衝突型加速器があります。
これをイベントシステムを使って実装しましょう。
シーンにGameObjectを追加し、EventsManagerという新しいスクリプトを追加することから始めましょう。cs
最初のイベントは、プレイヤーがドアのトリガーエリアに出入りしたときに発生するイベントです。
そのために、EventsManagerで。csクラスは、DoorTriggerEnterとDoorTriggerExitの二つのイベントアクションを作成し、また、それぞれのイベントアクションを呼び出すことができるメソッド。 また、クラスの静的シングルトン参照を作成します。
今、私たちはこれらのイベントを起動して購読できるオブジェクトが必要です。 そのために、2つのクラス、ドア用の1つ、DoorControllerを作成します。cs、およびドアのトリガー領域のためのもの、DoorTrigger。cs。
csでは、誰かがDoorTriggerEnterまたはDoorTriggerExitイベントを発生させたときにリッスンしてタスクを実行できる2つのメソッドを作成します。 DoorControllerのStartメソッドで、静的インスタンスを使用してEventsManagerクラスからイベントにアクセスし、それぞれのメソッドをサブスクライブします。
今、私たちのイベントは準備ができており、加入者はこれらのイベントを聞いています。 そのため、DoorTriggerクラスでは、OnTriggerEnterメソッドでこれらのイベントを発生させるだけです。
わかった. それでは、それぞれのドアとトリガー領域にDoorControllerとDoorTriggerスクリプトを添付してシーンを再生しましょう。
一つ問題がある..
EventManagerはシングルトンクラスで、すべてのドアトリガーがイベントを呼び出し、すべてのドアコントローラーがその同じイベントをリッスンして応答します。 同じidを持つドアだけがそのイベントをリッスンするように、イベントを呼び出している間に一意のidを渡す必要があります。
私たちの特定のケースでは、triggersとdoorの親オブジェクトは同じです。 そのため、親のgameobjectのインスタンスidを渡すことができます。
のは、シーンを再生してみましょう。.
そうだな. それは今期待どおりに働いています。
これらのイベントは、望ましくないエラーにつながる可能性があるため、必ず購読を解除してください。 たとえば、実行時にドアを破壊した場合などです。
だから、それが私たちの単純なイベントシステムを作ることができる方法です。
それは今の人々のためのすべてです。.. 幸せなコーディング! 🙂