Bolt 튜토리얼 - 챕터 4

<< 이전 챕터

애니메이션 (메카님)

이 챕터에서는 Bolt를 사용하여 네트워크를 통해 애니메이션을 복제하는 방법에 대해서 설명할 것 입니다. 심지어 Bolt에서도 여러가지 많은 방법이 있으며 우리는 네트워크 상에서 메카님 파라미터 상태를 복제하는 기본 방법에 대해서 살펴볼 것 입니다. 메카님 복제에 대해서 언급할 사항이 많지 않기 때문에 이 챕터는 좀 짧긴 하지만 중요한 주제이기 때문에 자체 챕터로 다룰만한 가치가 있습니다.

메카님 에셋 생성하기

첫 번째로 우리가 할일은 사용하고 있는 캐릭터의 Animator Controller 를 연결하는 것으로 컨트롤러는 bolt_tutorial/art/models/sgtBolt/sgtBolt4merged 에 있습니다. 이 컨트롤러를 TutorialPlayer 프리팹위의 sgtBolt4Merged-ModelOnly 하위 객체 Controller 슬롯에 끌어 놓아 다음으로 설정해주세요:

  1. Root Motion 을 사용불가로 합니다.
  2. Update ModeAnimate Physics 로 설정합니다.

애니메이터 컨트롤러가 연결되었을 때, Unity 애니메이터 에디터에서 여시기 바랍니다.

여기에서 사용할 수 있는 파라미터들을 볼 수 있으며, 우리는 MoveZ, MoveX와 Jump만을 사용할 것 입니다. MoveZ와 MoveX는 flaot이며 Jump는 트리거 입니다. Window/Bolt Engine/Assets 윈도우로 이동하여 전에 생성했던 TutorialPlayerState 를 엽니다.

여기에서 세 개의 새로운 속성들을 정의할 것 입니다. 메카님 애니메이터에서 사용하고 있는 세 개와 동일하게 부릅니다.

  • MoveX, Float
  • MoveZ, Float
  • Jump, Trigger

각 속성의 설정에서 메카님 설정을 Disabled 에서 Parameter 로 변경합니다.

구성이 필요한 한 가지 옵션이 더 있습니다. 메카님에 대한 Disabled/Parameter/Layer Weight 실렉터 우측에서 Use Animator MethodsUse Bolt Properties 에서 선택하는 옵션이 있습니다.

  • Use Animator Methods 의 의미는 메카님의 일반적인 SetFloat, SetInteger등의 메소드를 사용한다는 것 이고 Bolt가 자동적으로 이 값을 뽑아 낸다는 것입니다.
  • Use Bolt Parameters 는 메카님 값을 설정하기 위해 Bolt 파라미터를 사용하여 Bolt가 파라미터들을 메카님에 적용한다는 것 입니다.

또한 상태만을 위한 설정내의 상단에서 이 상태를 구성할 수도 있습니다. 우리는 MoveZ, MoveX와 Jump에 대해서 Use Bolt Properties 으로 선택할 것 입니다.

이제 거의 완료 되었습니다. 이제 다시 Bolt를 컴파일 하면 됩니다. Assets/Compile Bolt Assets (All) 로 이동하여 Bolt 컴파일을 해주세요. 이제 TutorialPlayerController.cs 스크립트를 엽니다.

AnimatePlayer 라고하는 새로운 메소드를 추가할 것 이며 이 메소드는 앞/뒤로 움직이는 것에 따라 MoveZ 파라미터를 -1 또는 +1로 설정하고 좌/우에 대한 MoveX를 설정하는 표준 메카님 코드와 거의 유사합니다.

  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이면 이 커맨드가 처음으로 실행되었다는 의미입니다.

  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;

      if (cmd.IsFirstExecution) {
        AnimatePlayer(cmd);
      }
    }
  }

만약 이 커맨드가 처음으로 실행되었다면 애니메이션을 적용합니다. 지금 게임을 실행하여 캐릭터가 주위를 돌아다니게 할 수 있습니다. Play As Server 를 선택하실 수 있으며 원하시면 클라이언트를 연결할 수도 있습니다.

마지막으로 해야할 일은 Bolt에게 올바른 애니메이터로 전달하는 것입니다. 이 작업은 트랜스폼 설정을 해 놓은 붙혀진 콜백 내에서 수행할 것 입니다.

  public override void Attached() {
    state.SetTransforms(state.Transform, transform);
    state.SetAnimator(GetComponentInChildren<Animator>());
  }

완료하기전에 두 개의 수정을 할 것 입니다. 게임을 테스트 했다면 캐릭터 애니메이션이 딱딱 끊어지는 것을 보게 될것이고 좋아 보이지 않습니다. MoveZMoveX 속성에서 damping 0.05를 추가합니다.

이제 플레이 할 수 있으며 애니메이션 전환이 더 부드러워질 것 입니다!

다음 챕터 >>

기술문서 TOP으로 돌아가기