This document is about: QUANTUM 3
SWITCH TO

イベント 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 確定フレーム

どちらの方法を使用するにせよ、PredictedVerifiedのどちらを使用するかのオプションがあります。両者にはそれぞれ利点と欠点があります。予測フレームは、より迅速なフィードバックが得られますが、ロールバックの影響を受けて不正確になる可能性があります。一方、確定フレームは正確ですが、サーバーとの往復時間がかかる分、エフェクトが出るまで少し時間がかかります。開発者は通常これらを組み合わせて使用します。例えば、ゲームスコア表示には確定フレームを使用し、ジャンプや被弾のエフェクト表示には予測フレームを使用できます。

Back to top