RPC와 애니메이션

RPC and Animation 맵으로 넘어가겠습니다. 이 맵에는 Strix Animation Sync 요소와 RPC(원격 프로시저 호출)가 표시됩니다.

../../../_images/rpc.png
  • 여기에는 두 캐릭터가 있어 돌아다니며 서로 쏠 수 있습니다. 한 동안 움직이지 않으면 플레이되는 유휴 애니메이션도 있습니다.

  • 시작은 먼저 RPCAnimationReplicationBP > Character > Blueprints 폴더에서 3rdPersonPawn 블루프린트를 여는 것입니다.

  • 이것은 몇 가지 함수가 있는 꽤 복잡한 블루프린트입니다. 캐릭터는 슈팅 속도를 달리하여 가벼운 공격을 할 수도 있고, 무거운 공격을 할 수도 있으며, 맞으면 데미지를 입습니다. 캐릭터의 HP가 고갈되면 사라졌다가 리스폰됩니다. 이제 Strix가 필요한 관련 부분을 살펴보겠습니다.

../../../_images/registerrpc.png
  • 첫 부분은 RPC입니다. RPC는 Remote Procedure Call을 줄인 말입니다. RPC는 클라이언트가 인스턴스화하고 다른 클라이언트에 호출되는 함수입니다. 이 경우에는 공격할 때, 또 자신이나 지형이 맞았을 때 호출하겠습니다. Strix에서는 RPC를 호출하려면 먼저 등록해야 합니다. On Sync Begin에서, 등록하고자 하는 RPC 각각에 대해 Register Strix RPC를 호출합니다. 이때 해당 블루프린트에서 TargetSelf로 설정하고 Function Name해당 블루프린트 함수의 이름으로 설정합니다. 이것은 레플리카에서도 필요하므로 자신이 방장인지는 확인하지 않습니다. 이것은 On Sync Begin 이벤트에서도 해야 합니다. 하지 않으면 Replicator가 준비되었는지 알 수 없기 때문입니다.

../../../_images/callattack.png
  • 총을 쏘면 RPC를 호출하여 공격이 보이게 만듭니다. 이것이 모든 플레이어의 화면에 표시되도록 ShotEffectFunction Name으로 하여 Send Rpc to All 함수를 호출합니다. 이렇게 하면 로컬을 포함하여 멤버 전체가 발사와 총구 플래시를 애니메이팅합니다. 다음으로, Fire Rate 변수를 전송하여 애니메이션의 속도를 결정합니다. Strix RPC는 Strix Relay Arguments를 취하며, Strix Unreal SDK에는 여기에 필요한 타입 캐스트가 있습니다. 이때 전달하는 인수에 유의해야 합니다. 잘못된 인수를 전달하면 RPC 호출이 실패하기 때문입니다.

../../../_images/callonhit.png
  • 여기서는 로컬에 Attack 함수를 호출하여 각 탄이 어디에 떨어질지 결정합니다. Attack 함수는 지형에 명중했는지, 플레이어에 명중했는지 판단하여 관련 RPC를 호출합니다. 이 On Hit 호출은 이펙트를 보여주고 플레이어에게 데미지를 적용합니다. 이 RPC들은 인수가 필요합니다. 따라서 RPC를 이용할 때 데이터가 얼마나 필요할지, 얼마나 처리할지 생각해 두는 것이 좋습니다. 레플리카가 로컬에서 같은 결과를 만들 수 있도록 데이터를 충분히 보내주기만 하면 됩니다. 결과를 한꺼번에 보내기보다는 클라이언트 간에 처리 시간을 분산하는 것이 더 좋습니다.

참고

RPC가 로컬과 원격에 모두 등록되어 있다면 호출은 하나씩 시작해야 합니다. 그러지 않으면 로컬에서 명중을 이미 적용한 후에 명중한 RPC를 호출하게 됩니다.

../../../_images/repnotify.png
  • 본 블루프린트에서 마지막으로 살펴볼 것은 RepNotify 기능입니다. 여기 캐릭터에는 체력값이 있습니다. 캐릭터가 (총에) 맞으면 데미지를 일정량 뺍니다. 이 변수를 Replicated로 설정하면 이것을 동기화할 수 있습니다. 그러나 틱마다 값을 확인하여 체력 표시줄을 업데이트해야 합니다. 틱마다 일어나지 않는 이벤트는 변수를 RepNotify로 설정하는 것이 좋을 수도 있습니다. RepNotify에서는 값이 변할 때마다 호출되는 함수가 만들어집니다. On Rep Health 함수에서 체력 표시줄이 업데이트되며, 캐릭터가 데미지를 너무 많이 입으면 죽고 리스폰됩니다.

  • 이 블루프린트를 보고 설명서를 읽으면 RepNotify를 충분히 이해할 수 있습니다. 다음으로, RPCAnimationReplicationBP > Character > AnimBlueprint 폴더에서 3rdPersonAnim 블루프린트를 엽니다. 캐릭터의 애니메이션 블루프린트로, 여기서 애니메이션을 일부 동기화할 수 있습니다.

  • 애니메이션은 복잡하지만 동기화는 명료합니다. 전과 같이, 복제된 값을 설정하기 전에 방장인지 확인해야 합니다. 또, Strix Replicator에 레퍼런스를 리턴하기 위해 Get Owning ActorGet Component by Class를 호출하는 과정을 더 거쳐야 합니다. 이 외에는 어떤 값을 동기화할지만 결정하면 됩니다.

  • 복제된 캐릭터는 대개 애니메이션이 좋습니다. 보시다시피 저희는 Strix Animation Sync 요소를 아직 추가하지 않았습니다. 캐릭터 애니메이션은 부분적으로 플레이어가 제어합니다. 그래서 이 경우에는 올바른 제어 방향을 알 수 없습니다. 이것을 해결하기 위해 저희는 Control RotationActor Rotation 값을 동기화합니다. 회전을 바르게 보간하기 위해 델타 타임 값도 동기화해야 합니다. 이것은 Strix Replicator와 작동 방식이 같습니다. 애니메이션 동기화 요소는 애니메이션 블루프린트의 Replicator와 같다고 보면 됩니다.

../../../_images/separate.png
  • 여기서는 두 값, 즉 Time IdleisShooting을 추가했습니다. Time Idle은 애니메이션 상태를 유휴 애니메이션으로 바꾸는 시점을 결정하고, isShooting 변수는 슈팅이 발생했을 때 유휴 상태에서 빨리 빠져나와야 하는지를 결정합니다. 이 값들이 모두 동기화되면 애니메이션은 바르게 작동합니다.

참고

Strix에서는 대부분 Replicator와 Movement Synchronizer를 연결할 수 있습니다. 앞으로도 마찬가지입니다. 그러나 애니메이션은 조금 복잡합니다. 클라이언트에 복제되고 있는 것과 호환되는지 확인해야 하기 때문입니다.

참고

Strix Animation Sync 요소는 그래프 간의 값을 동기화합니다. 단, 상태 머신이나 애니 그래프에서는 어떤 값도 직접 설정할 수 없습니다. 이벤트 그래프에서만 가능합니다.

슈팅 예시가 끝났으므로 마지막 맵으로 넘어가겠습니다.

../../../_images/gameroom.png

참고

마지막 맵에서는 방을 세 개 만듭니다. 비채팅방에 입장해 주십시오.