4 - アニメーション
本章では、Boltを用いてネットワーキング上にアニメーションを複製する方法を学びます。
このための方法には様々なものがあり、Bolt内にも複数の方法があります。ここでは、ネットワーク上にmecanimパラメータの状態を複製する デフォルト の方法を見ていくことにしましょう。
Mecanimの複製については書くことが少ないため本章は比較的短いですが、非常に重要な章です。
Mecanim Assetの作成
最初に、Animator Controller に接続し、作成しているキャラクターを確認しましょう。コントローラは、bolt_samples/AdvancedTutorial/art/models/sgtBolt/sgtBolt4merged から確認できます。
また、以下の設定も行ってください。
- TutorialPlayer プレハブ上で sgtBolt4Merged-ModelOnly サブサブジェクトを選択します。
- フォルダ bolt_samples/AdvancedTutorial/art/models/sgtBolt を開きます。
- Animator Controller sgtBolt4merged;を探します。
- それを Animator コンポーネント上の Controller スロットにドラッグします。
- Apply Root Motion;を非有効化します。
- Update Mode を Animate Physics に設定します。
アニメーターコントローラーが接続したらダブルクリックし、Unity Animator Editor
を開きます。
利用可能なパラメータを参照するには、Parameters タブをクリックします。
ここには複数のパラメータが表示されますが、現時点ではMoveZ。MoveX、Jumpのみを使用します。
MoveZとMoveXは浮動小数で、Jumpはトリガーです。
Bolt/Assets
ウィンドウに進み、先に作成したTutorialPlayerState
を開きます。
ここで新たに3つのプロパティを定義します。使用しているMecanimアニメーターから上記の3つと同じものをよびだしてください。
- MoveX [Float];
- MoveZ [Float];
- Jump [Trigger].
それぞれのプロパティについて、Mecanim
設定を Disabled から Parameter に、またReplication
を Everyone から Everyone Except Controller に変更してください。
もう1つ必要な設定があります。* Animator Methods* または Use Bolt Properties へと設定できるMecanim Mode
オプションがあります。
Animator Methodを用いる ということは、通常のSetFloat
やSetInteger
などのMecanimのメソッドを用いるということです。Boltは自動で値を引き出すことができます。
Bolt Parametersを用いる ということは、Boltのパラメータを用いてMecanimの値を設定し、Boltがmecanimに適応できるようにするということです。
この状態の設定は、特定の設定のトップまたはMecanim
設定の最後のドロップダウンのプロパティで行うこともできます。
Use Bolt Properties をMoveZ、MoveX、Jumpについて選択してください。
もうほとんど完了していますが、Boltをもう一度コンパイルしてください。Bolt/Compile Assembly
に進み、自動的に処理させましょう。
TutorialPlayerController.cs スクリプトを開きます。
AnimatePlayer という新しいメソッドを追加します。これは標準のMecanimコードです。ここで、前に動かすか後ろに動かすかに応じてMoveZのパラメータを-1か+1に設定してください。また、MoveXのパラメータを、左に動かすか右に動かすかに合わせて同様に設定してください。
C#
void AnimatePlayer(TutorialPlayerCommand cmd)
{
// FWD <> BWD movement
if (cmd.Input.Forward ^ cmd.Input.Backward)
{
state.MoveZ = cmd.Input.Forward ? 1 : -1;
}
else
{
state.MoveZ = 0;
}
// LEFT <> RIGHT movement
if (cmd.Input.Left ^ cmd.Input.Right)
{
state.MoveX = cmd.Input.Right ? 1 : -1;
}
else
{
state.MoveX = 0;
}
// JUMP
if (_motor.jumpStartedThisFrame)
{
state.Jump();
}
}
ExecuteCommand
機能内部で、AnimatePlayer
機能を呼び出してください。そして、IsFirstExecution
というコマンドに関する特殊なプロパティにアクセスします。
これがtrueならば、このコマンドが実行されたのが初めてであることを示しています。この場合にはアニメーションを適用します。
C#
public override void ExecuteCommand(Bolt.Command command, bool resetState)
{
TutorialPlayerCommand cmd = (TutorialPlayerCommand)command;
if (resetState)
{
// we got a correction from the server, reset (this only runs on the client)
_motor.SetState(cmd.Result.Position, cmd.Result.Velocity, cmd.Result.IsGrounded, cmd.Result.JumpFrames);
}
else
{
// apply movement (this runs on both server and client)
PlayerMotor.State motorState = _motor.Move(cmd.Input.Forward, cmd.Input.Backward, cmd.Input.Left, cmd.Input.Right, cmd.Input.Jump, cmd.Input.Yaw);
// copy the motor state to the commands result (this gets sent back to the client)
cmd.Result.Position = motorState.position;
cmd.Result.Velocity = motorState.velocity;
cmd.Result.IsGrounded = motorState.isGrounded;
cmd.Result.JumpFrames = motorState.jumpFrames;
// NEW CODE
if (cmd.IsFirstExecution)
{
AnimatePlayer(cmd);
}
}
}
最後に、Boltに対する正しいAnimator
に渡すことです。変換の設定を行うAttached
コールバック内部でこれを行います。
C#
public override void Attached()
{
// This couples the Transform property of the State with the GameObject Transform
state.SetTransforms(state.Transform, transform);
state.SetAnimator(GetComponentInChildren<Animator>());
// Configure Animator
state.Animator.SetLayerWeight(0, 1);
state.Animator.SetLayerWeight(1, 1);
}
これで、ゲームを開始しキャラクターを動かせるようになりました。Play As Server を選択するか、またはクライアントを接続してください。
Back to top