RPCとアニメーション¶
次のマップRPC and Animationに移りましょう。このマップはStrix Animation SyncコンポーネントとRPC(遠隔手続き呼び出し)の使用例です。
ここには2人のキャラクターがいて、走り回ってお互いを撃つことができます。また、アイドルアニメーションもあり、しばらく動いていないと再生されます。
まず、RPCAnimationReplicationBP > Character > Blueprintsフォルダーにある3rdPersonPawnブループリントを開いてください。
これは相当に複雑なブループリントですが、機能は多くありません。キャラクターは軽攻撃か重攻撃を発射できますが、発射の頻度が異なります。撃たれたキャラクターはダメージを受けます。キャラクターのHPがなくなると消滅し、少し後で再びリスポーンします。では、Strixを必要とする部分を見てみましょう。
最初の部分はRPCです。RPCはRemote Procedure Call(遠隔手続き呼び出し)の略です。RPCは関数ですが、あるクライアントが起動すると他のクライアント上で呼び出されます。この例では、攻撃したときと、自分か地形が撃たれたときに呼び出されます。Strixでは、RPCを呼び出すにはまず登録する必要があります。On Sync Beginから、登録するそれぞれのRPCについてRegister Strix RPCを呼び出しますが、このときTargetをSelfに設定し、Function Nameをブループリントの関数の名前に設定しておきます。これはレプリカでも行う必要があるため、オーナーであるかどうかの確認はしません。また、これはOn Sync Beginイベントで実行する必要があります。そうしないと、レプリケーターの準備ができていないかもしれないためです。
銃を撃ったら、RPCを呼び出して攻撃が目に見えるようにします。これを全てのプレイヤーの画面に表示するために、Function NameをShotEffectにしてSend Rpc to All関数を呼び出します。すると、ローカルを含む全てのメンバー上で呼び出しが行われ、射撃と銃口のフラッシュをアニメーションします。次に、Fire Rate変数を渡して、アニメーションの速度を決定します。Strix RPCはStrix Relay Argumentsの配列を受け取ります。Strix Unreal SDKはこのために必要な型のキャストを提供します。間違った引数を渡すとRPC呼び出しが失敗するため、渡す引数には注意してください。
ローカルのAttack関数を呼び出して各射撃がどこに着弾するかを判定します。Attack関数は射撃が地形かプレイヤーに当たったかどうかを判断し、当たった場合には適切なRPCを呼び出します。これらのOn XXX Hitの呼び出しはエフェクトを表示し、プレイヤーにダメージを適用します。これらのRPCも引数を取ります。RPCを使用するときには、送信するデータの量と処理の量について検討することをお勧めします。レプリカがローカルと同じ結果を生成するのに最低必要なデータのみを送信するようにしましょう。通常、大量の処理結果を送信するよりも複数のクラアントに処理時間を分散する方が有利です。
注釈
RPCはローカルとリモートの両方に登録されていますが、呼び出しはどちらか一方のみで行う必要があります。そうしないと、1回の着弾についてOn HitのRPCが2回呼び出されてしまいますが、その結果は既にローカルに適用済みです。
このブループリントで注目するべき最後の点は、RepNotify機能です。キャラクターにはHP値があり、キャラクターが撃たれたときにダメージ分を減らします。変数をReplicatedに設定して値を同期することもできますが、そうすると、ティックのたびに値を確認し、HPバーを更新して表示しなければならなくなります。毎ティック発生するわけではないイベントでは、変数をRepNotifyに設定することをお勧めします。RepNotifyは、値が変化したときに呼び出される関数を生成します。On Rep Health関数ではHPバーを更新し、キャラクターがダメージを受け過ぎた場合は死亡させて、その後リスポーンします。
RepNotifyに関する理解を深めるために、このブループリントを眺めた後でドキュメントを一通りお読みください。次は、RPCAnimationReplicationBP >Character >AnimBlueprintフォルダーにある3rdPersonAnimブループリントを開きましょう。これはキャラクターのアニメーションブループリントですが、この中でアニメーションの同期を行っています。
以前と同様に、複製された値を設定する前に、オーナーであるかどうかを確認する必要があります。その際にStrix Replicatorへ渡す参照を、Get Owning ActorとGet Component by Classを呼び出した戻り値から得るという追加の手順が必要です。これ以外は、同期する値を決定する必要があるのみです。
複製されたキャラクターは大抵ちゃんとしたアニメーションを持っていますから、(お気付きと思いますが)ここまではStrix Animation Syncコンポーネントを追加する必要がありませんでした。しかしキャラクターのアニメーションの一部はプレイヤーによってコントロールされます。その場合、適切なコントロールの回転量を知ることができません。これを解決するために、Control RotationとActor Rotationの値を同期します。また、回転を正しく補間するために、デルタ時間値も同期する必要があります。これは、Strix Replicatorと同じように機能します。Animation Syncコンポーネントは、単にアニメーションブループリント用のReplicatorだとお考えください。
ここではTime IdleとisShootingという2つの値を追加しています。Time Idleは、アニメーションの状態をアイドルアニメーションに切り替えるタイミングの決定に使用し、isShooting変数は、射撃を行ったためにアイドルアニメーションを早く中断する必要があるかどうかを判定します。これら値は全て同期されるため、アニメーションが正しく動作できます。
注釈
Strixを使うときには、ほとんどの場合にReplicatorとMovement Synchronizerをアタッチすることができて、全てうまく動作するはずです。ただし、アニメーションは少々トリッキーなので、クライアントへ複製する際に互換性を確認する必要があります。
注釈
Strix Animation Syncコンポーネントは、全てのグラフに渡って値を同期します。ただし、自分でステートマシーンやアニメーショングラフに値を設定することはできません。値を設定できるのはイベントグラフのみです。
シューティングの例を終えて、最後のマップに進みましょう。
注釈
最後のマップはルームを3つ作成します。チャットでないルームに参加してください。