イベント vs ポーリング
はじめに
Unityでビューコードを記述する際、フレームから情報を読み取り、ユーザーに関連データを表示することは、Quantumのゲームでは一般的な方法になります。
そのためのアプローチは2つあります。1つ目のアプローチはポーリングで、Update
ループやQuantumEntityViewComponent
コールバック内で、定期的にビューコードから情報をリクエストします。2つ目のアプローチはQuantumイベントで、Quantumのイベントシステムでメソッドを購読し、それらを使用してビューを更新します。
ポーリング
ポーリングのシンプルなアプローチは次のようになります。
C#
namespace Quantum
{
using UnityEngine;
public class CharacterAnimations : QuantumEntityViewComponent
{
private Animator _animator;
public override void OnInitialize()
{
_animator = GetComponentInChildren<Animator>();
}
public override void OnUpdateView()
{
var kcc = PredictedFrame.Get<CharacterController3D>(EntityRef);
_animator.SetFloat("Speed", kcc.Velocity.Magnitude.AsFloat);
}
}
}
このスニペットでは、ビュー更新のコールバックを実装していて、これはフレームのシミュレーション完了後に呼び出され、親クラスから利用可能なPredictedFrame
を使用して、ゲームステートをポーリングし、ビュー(このスニペットで具体的に言うと、アニメーション)に適用します。
フレームAPIは読み取り専用操作のみを使用していることを確認してください。Unityからの書き込みは決定論的ではなくなります。
イベントベース
イベントベースのシンプルなアプローチは次のようになります。
C#
namespace Quantum
{
using UnityEngine;
public class CharacterAnimations : QuantumEntityViewComponent
{
private ParticleSystem _particles;
public override void OnInitialize()
{
_particles = GetComponent<ParticleSystem>();
QuantumEvent.Subscribe<EventOnDamaged>(this, OnDamaged);
}
private void OnDamaged(EventOnDamaged e)
{
if (e.EntityRef == EntityRef)
{
_particles.Play();
}
}
}
}
このスニペットは、開発者が作成したシミュレーションイベントを購読して、Unityでパーティクルエフェクトを再生するものです。イベントクラスにゲームデータを含んで送信することも可能です。このクラスには、フレームを含むゲームの参照が既に含まれています。
イベントについての詳細は、イベントとコールバックをご覧ください。
利点と欠点
どちらの方法にもそれぞれ欠点があります。
イベントベースのコードは、Unityに情報を頻繁に送信する必要がない場合はパフォーマンスが向上します。毎フレーム発生せず、ゲームビューに影響を与えるようなゲームの状況なら、通常はイベントで表現する方が適しています。しかし、ゲームデータを毎フレーム送信する必要がある場合は、イベントはポーリングよりおそらくパフォーマンスが落ちるでしょう。ただし、Quantumイベントは「撃ちっ放し」なので、途中参加者が参加する前に実行されたイベントは受信されません。そのため、イベントから作成されたビジュアル要素は、クライアント参加時に手動で再作成する必要があります。
ポーリングのコードは、一般的にシンプルに記述できて理解しやすいため、非常に頻繁に(毎フレーム)変更されるビジュアルデータ表現の使用に適しています。ポーリングの性質上、途中参加者のビジュアルの初期化は自動的に行われます。なぜなら、ビジュアルを構築するために必要なすべてのデータは、途中参加者が受信するゲームステートに既に含まれていることが保証されているからです。
予測フレーム vs 確定フレーム
どちらの方法を使用するにせよ、Predicted
かVerified
のどちらを使用するかのオプションがあります。両者にはそれぞれ利点と欠点があります。予測フレームは、より迅速なフィードバックが得られますが、ロールバックの影響を受けて不正確になる可能性があります。一方、確定フレームは正確ですが、サーバーとの往復時間がかかる分、エフェクトが出るまで少し時間がかかります。開発者は通常これらを組み合わせて使用します。例えば、ゲームスコア表示には確定フレームを使用し、ジャンプや被弾のエフェクト表示には予測フレームを使用できます。