Photon Quantum Animation制御

AnimationParametersをポーリング

この方法はAnimationParametersの値を変更することで、それぞれ設定しているAnimationに切り替える方法。

AnimationController

今回はParametersにキャラクターの移動速度をポーリングするための値Speed変数をfloat型で追加しました。

Script

using Quantum;
using UnityEngine;

public class CharacterAnimations : QuantumEntityViewComponent
  {
    private Animator _animator;

    // Entity生成時に一回
    public override void OnInitialize()
    {
       // EntityAddしているAnimatorの取得
      _animator = GetComponentInChildren<Animator>();
    }

    // 毎フレーム呼ばれる
    public override void OnUpdateView()
    {
   // このScriptをAddしているEntityのCharacterController3Dを取得
      var kcc = PredictedFrame.Get<CharacterController3D>(EntityRef);
      // animatorのSpeedParameterの値を更新する
      _animator.SetFloat("Speed", kcc.Velocity.Magnitude.AsFloat);
    }
  }

QuantumEntityViewComponent:公式リンク

これをEntityViewのゲームオブジェクトにAddComponentすることで、スクリプトからEntityRefやGame・PredictedFrame・VerifiedFrameの取得や、オーバーライド可能なメソッドを使用できます。
このコンポーネントはQuantumEntityViewUpdater(EVU)にまとめられて更新される。
Quantum版のMonoBehaviour

OnInitialize()

エンティティが初めて生成される度に呼び出されるメソッド。
Game・VerifiedFrame・PredictedFrame・PredictedPreviousFrameはまだ取得でき無ない。
今回はEntity生成時にEntityViewからAnimatorを取得しています。

OnUpdateView()

Unity更新時(クライアント側のフレーム更新時)にEVUのOnObservedGameUpdated()から呼び出される。

PredictedFrame.Get<CharacterController3D>(EntityRef)

このメソッドでこのEntityのQPrototypeCharacterController3Dを取得している。
取得したコントローラーからkcc.Velocity.Magnitude.AsFloatでキャラクターの方向ベクトルの強さを.AsFloatでFPに変換している。

イベント(Observer)

ジャンプなどのTriggerでコントロールできるアニメーションで使用する。

Qtn

event PlayerJump
{
    EntityRef EntityRef;
}

Script:呼び出し先

namespace Quantum
{
  using UnityEngine;

  public class CharacterAnimations : QuantumEntityViewComponent
  {
    // 使用したいアニメーション
    private Animator _animator;
    // 親クラスからの初期化メソッド
    public override void OnInitialize()
    {
      _animator = GetComponentInChildren<Animator>();
      // イベントが発生した時該当メソッドが呼ばれるように登録
      // <>にQTNに登録した名前の戦闘にEventをつけて指定
      QuantumEvent.Subscribe<EventPlayerJump>(this, OnPlayerJump);
    }
    // Eventに登録するメソッド
    private void OnPlayerJump(EventPlayerJump e)
    {
      // 同じEntityかどうか調べる
      // EntityRefは親クラスから呼ばれる
      if (e.EntityRef == EntityRef)
      {
        // 実行したいアニメーション
        _animator.SetTrigger("Jump");
      }
    }
  }
}

Script:呼び出し元

namespace Quantum
{
    using Photon.Deterministic;

    unsafe class MovementSystem : SystemMainThreadFilter<Filter>
    {
        public override void Update(Frame frame, ref Filter filter)
        {
            var input = frame.GetPlayerInput(filter.Player->PlayerRef);

            if (input->Jump.WasPressed)
            {
                // QTNに登録された名前を呼び出し
                // Eventに追加しているメソッドを呼び出す
                frame.Events.PlayerJump(filter.EntityRef);
                filter.Kcc->Jump(frame);
            }
        }

        public unsafe struct Filter
        {
            public EntityRef EntityRef;
            public PlayerLink* Player;
            public CharacterController3D* Kcc;
        }
    }
}

URL

アニメーション公式URL

コメント

タイトルとURLをコピーしました