AnimationParametersをポーリング
この方法はAnimationParametersの値を変更することで、それぞれ設定しているAnimationに切り替える方法。
AnimationController
今回はParametersにキャラクターの移動速度をポーリングするための値Speed変数をfloat型で追加しました。

Script
using Quantum;
using UnityEngine;
public class CharacterAnimations : QuantumEntityViewComponent
{
private Animator _animator;
// Entity生成時に一回
public override void OnInitialize()
{
// EntityにAddしている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;
}
}
}

コメント