This document is about: QUANTUM 3
SWITCH TO

イベント 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イベントはファイア・アンド・フォゲットであり、遅れて参加するプレイヤーは参加する前に実行されたイベントを受信することはありません。したがって、イベントから作成された視覚的要素は、クライアントが参加したときに手動で再作成する必要があります。

ポーリングコードは一般的に書きやすく、理解しやすいため、非常に頻繁に変わる視覚データを表現するのに適しています(毎フレーム)。ポーリングの特性により、遅れて参加するプレイヤーのために視覚を初期化するのが自動的に行われます。これは、ビジュアルを構築するために必要なすべてのデータが遅れて参加するプレイヤーによって受信されたゲーム状態に既に含まれていることを保証するためです。

予測フレームと検証フレーム

これらのテクニックを使用する際には、予測されたフレームまたは検証されたフレームのいずれかを使用するオプションがあります。両者にはそれぞれ欠点と利点があります。予測フレームはより迅速なフィードバックを提供しますが、ロールバックの影響を受けて不正確になる可能性があります。一方、検証フレームは具体的ではありますが、サーバーとの往復が必要なため、効果が現れるまでに少し時間がかかります。通常、開発者はこれらを組み合わせて使用することが多く、たとえば、ゲームのスコアを表示するために検証フレームを使用し、ジャンプ雲やヒットパーティクルなどの効果には予測フレームを使用することができます。

Back to top