カメラ/ UIは、プレーヤーが誰であるかをどのようにして知るのですか?


7

特定のエンジンコンポーネント(カメラやUIなど)が、誰をフォローするか、その健康状態やその他の属性を画面に表示する方法を知る方法について、少しジレンマに陥っています。

これらのコンポーネントとエンティティ間の通信が行われるシステムをどのように構築しますか?プレーヤーを表す別のエンティティを作成することもできますが、少し「ハードコード」されているようです。カメラをパンしたい場合はどうなりますか?プレーヤーが別のエンティティの制御を開始した場合はどうなりますか?

つまり、カメラやUIなどのコンポーネントのデータソースを抽象化して、それらが表すエンティティを気にしないようにするにはどうすればよいですか。


イベントシステムは多くの場合に役立ちますが、変化する、または「まれに」生成される情報(プレーヤーの死亡など)を伝播するのにより適しています。エンティティの状態や位置など、フレームごとに把握する必要があるものには、イベントシステムはあまり適していません。


そして、カメラは入力を受け取りますか?または、プレイヤーキャラクター、または抽象的なコントローラー。したがって、カメラはプレイヤーに追従し、誰がcinputコントローラによって動かされますか?
減速

回答:


10

最も簡単な解決策は、Camera.TargetやUI.Subjectなど、プレーヤーキャラクターを指すが、必要に応じて他のオブジェクトにリダイレクトできる(またはNULLに設定できる)オブジェクトへのメンバーポインターを保持することです。

プレーヤーがキャラクターを変更した場合、カメラのターゲット変数とUIのサブジェクトを変更するイベントを送信します。カメラをパンしたい場合は、「ターゲット」の動作をオーバーライドして、手動の動きに設定します。


+1これは私が使うものと似ています。ITarget基本的にX / Y変数を定義するだけのインターフェースを作成しました(私のゲームは2Dです)。私のPlayerクラスはこのインターフェイスを実装し、X / Y座標で値を更新します。次に、型のプロパティCameraがありTargetますITarget。それぞれUpdateCameraチェックし、それが持っている場合はTarget、それに応じて自分自身を更新し、それ以外の場合は、何か他のものは、(私の場合、それはキーの押下に基づいて自由で移動ですが、あなたがやりたいことができます)ん。
Richard Marskell-Drackir 2011年

2

これを行う最も簡単な方法は、1台のカメラのみに制限されないことです。

代わりに、私のゲームの世界はカメラでいっぱいで、何十、何百ものカメラがあります。制御可能な可能性のあるキャラクターにはカメラがあり、カットシーンにはカメラがあります。多くの場合、単一のエンティティには、さまざまなプレーヤーのアクティビティ用に複数のカメラがあります。(戦闘移動、アイドリング、スプリントなど)。各カメラには、作成時にターゲットが与えられ、そのターゲットは(原則として)カメラの存続期間中一定のままです。

ここでの問題は、「カメラがどのキャラクターをフォローしているのかをどのようにして知るのか」ではなく、「レンダラーがシーン内のどのカメラを実際に現在レンダリングに使用しているのかをどのようにして知るのか」です。私はそのためにカメラマネージャークラスを使用します。これはシーン内のすべてのカメラを認識しており、ゲームロジックから受け取るイベントの指示に従って、1つから別のカメラにブレンドできます。


少しやりすぎですか?代わりに、基本型に基づいて動作を定義できませんか?(カットシーン、ヘッドなど)
減速

誤解しないでください。カメラには標準的な動作があります。シーン内のカメラのインスタンスごとに個別の実装を推奨しているわけではありません。潜在的な各カメラをシーン内の個別のインスタンスとして存在させることは、ブレンディングや、残りのコードベースで処理する必要のあるカメライベントのタイプの数を簡素化するのに非常に役立つというだけのことです。
Trevor Powell、

0

プレイヤーは、他のオブジェクトやエンティティとは十分に異なるため、独自のクラスを持つことになります。多くのゲームでは、エンジン全体で使用でき、常にプレーヤーを表す1つのグローバルプレーヤーオブジェクトを持っていることは完全に合法であり、プレーヤーについて知る必要があるすべてのシステムがそのクラスと話すことができます。これは、どこでもポインタを渡すよりもクリーンでシンプルです。

ゲームがネットワーク上のマルチプレーヤーである場合、ローカルプレーヤーとリモートプレーヤーの間に大きな違いがあるため、これは意味をなす可能性があります。2つのコントローラーでローカルマルチプレーヤーをサポートする場合は、複数のプレーヤーオブジェクトと付随するポインターパッシングが必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.