PUN Classic (v1)、PUN 2、Boltはメンテナンスモードとなっております。Unity2022についてはPUN 2でサポートいたしますが、新機能が追加されることはありません。お客様のPUNプロジェクトおよびBoltプロジェクトが停止することはなく、将来にわたってパフォーマンス性能が落ちることはありません。 今後の新しいプロジェクトについては、Photon FusionまたはQuantumへ切り替えていただくようよろしくお願いいたします。

4 - アニメーション

<<前章へ

本章では、Boltを用いてネットワーキング上にアニメーションを複製する方法を学びます。
このための方法には様々なものがあり、Bolt内にも複数の方法があります。ここでは、ネットワーク上にmecanimパラメータの状態を複製する デフォルト の方法を見ていくことにしましょう。
Mecanimの複製については書くことが少ないため本章は比較的短いですが、非常に重要な章です。

Mecanim Assetの作成

最初に、Animator Controller に接続し、作成しているキャラクターを確認しましょう。コントローラは、bolt_samples/AdvancedTutorial/art/models/sgtBolt/sgtBolt4merged から確認できます。
また、以下の設定も行ってください。

  1. TutorialPlayer プレハブ上で sgtBolt4Merged-ModelOnly サブサブジェクトを選択します。
  2. フォルダ bolt_samples/AdvancedTutorial/art/models/sgtBolt を開きます。
  3. Animator Controller sgtBolt4merged;を探します。
  4. それを Animator コンポーネント上の Controller スロットにドラッグします。
  5. Apply Root Motion;を非有効化します。
  6. Update ModeAnimate Physics に設定します。
Setting up the *Animator Controller* on the *TutorialPlayer*
*TutorialPlayer* 上の *Animator Controller* の設定

アニメーターコントローラーが接続したらダブルクリックし、Unity Animator Editorを開きます。

*Animator Editor* with our *Animator Controller* open
*Animator Controller* をともなう *Animator Editor* が開きます。

利用可能なパラメータを参照するには、Parameters タブをクリックします。
ここには複数のパラメータが表示されますが、現時点ではMoveZ。MoveX、Jumpのみを使用します。
MoveZとMoveXは浮動小数で、Jumpはトリガーです。
Bolt/Assetsウィンドウに進み、先に作成したTutorialPlayerStateを開きます。

ここで新たに3つのプロパティを定義します。使用しているMecanimアニメーターから上記の3つと同じものをよびだしてください。

  1. MoveX [Float];
  2. MoveZ [Float];
  3. Jump [Trigger].

それぞれのプロパティについて、Mecanim設定を Disabled から Parameter に、またReplicationEveryone から Everyone Except Controller に変更してください。

*TutorialPlayerState* editor with properties to use with the animation system
アニメーションシステムで使用するプロパティをともなう *TutorialPlayerState* エディター

もう1つ必要な設定があります。* Animator Methods* または Use Bolt Properties へと設定できるMecanim Modeオプションがあります。

Animator Methodを用いる ということは、通常のSetFloatSetIntegerなどの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 を選択するか、またはクライアントを接続してください。

Gameplay with Character Animations
キャラクターアニメーションをともなうゲーム

次章へ >>

Back to top