イベント vs ポーリング
はじめに
Unity内でシミュレーションから情報を読み取り、ユーザーに関連データを表示することは、Quantumゲームにおいて一般的な手法です。
これを実現するために、取ることができるアプローチは2つあります。1つ目のアプローチはポーリング
で、これはUpdate
ループ内などで定期的にUnityから情報を要求する方法です。2つ目のアプローチはQuantumイベントを使用することで、Quantumのイベントシステムにメソッドをサブスクライブし、それを使用して表示を更新します。
ポーリング
ポーリングのシンプルなアプローチは次のようになります。
C#
using Quantum;
using UnityEngine;
public class CharacterAnimations : QuantumCallbacks
{
private EntityView _entityView;
private Animator _animator;
private void Awake()
{
_entityView = GetComponent<EntityView>();
_animator = GetComponent<Animator>();
}
public override void OnUpdateView(QuantumGame game)
{
var frame = game.Frames.Predicted;
var kcc = frame.Get<CharacterController3D>(_entityView.EntityRef);
_animator.SetFloat("Speed", kcc.Velocity.Magnitude.AsFloat);
}
}
このスニペットは、ビューが更新されたときのコールバックを実装しています。これは、フレームシミュレーションが終了した後に発生し、コールバック自体からQuantumGame
を使用してフレームを取得し、そのフレームからゲーム状態をポーリングしてビューに適用します(このスニペットでは具体的にアニメーションに対してです)。
フレームAPIは読み取り専用の操作にのみ使用するようにしてください。Unityから書き込むことは決定論的ではないためです。
イベントベース
イベントベースのシンプルなアプローチは次のようになります。
C#
private void Start()
{
// subscribe to the simulation event
QuantumEvent.Subscribe<EventOnDamaged>(this, OnDamaged);
}
private void OnDamaged(EventOnDamaged e)
{
// play a particle effect to show a damage indication
GetComponent<ParticleSystem>().Play();
}
このスニペットは、ユーザーが作成したシミュレーションイベントにサブスクライブし、Unity内でパーティクルエフェクトを発生させるものです。イベントクラス内でゲームデータを送信することも可能で、このクラスにはフレームを見つけるためのゲームへの参照も含まれています。
イベントについての詳細は、イベントとコールバックを参照してください。
利点と欠点
これらの方法にはそれぞれ欠点があります。
イベントベースのコードは、情報をUnityに頻繁に送信する必要がない場合に、よりパフォーマンスが良くなることがあります。毎フレーム発生しないゲームの状況で、ゲームビューに影響を与えるものは通常、イベントで表現する方が適しています。しかし、そのようなゲームデータを毎ティックで送信する必要がある場合、イベントはおそらくポーリングよりもパフォーマンスが悪くなるでしょう。ただし、Quantumイベントはファイア・アンド・フォゲットであり、遅れて参加するプレイヤーは参加する前に実行されたイベントを受信することはありません。したがって、イベントから作成された視覚的要素は、クライアントが参加したときに手動で再作成する必要があります。
ポーリングコードは一般的に書きやすく、理解しやすいため、非常に頻繁に変わる視覚データを表現するのに適しています(毎フレーム)。ポーリングの特性により、遅れて参加するプレイヤーのために視覚を初期化するのが自動的に行われます。これは、ビジュアルを構築するために必要なすべてのデータが遅れて参加するプレイヤーによって受信されたゲーム状態に既に含まれていることを保証するためです。
予測フレームと検証フレーム
これらのテクニックを使用する際には、予測された
フレームまたは検証された
フレームのいずれかを使用するオプションがあります。両者にはそれぞれ欠点と利点があります。予測フレームはより迅速なフィードバックを提供しますが、ロールバックの影響を受けて不正確になる可能性があります。一方、検証フレームは具体的ではありますが、サーバーとの往復が必要なため、効果が現れるまでに少し時間がかかります。通常、開発者はこれらを組み合わせて使用することが多く、たとえば、ゲームのスコアを表示するために検証フレームを使用し、ジャンプ雲やヒットパーティクルなどの効果には予測フレームを使用することができます。