리플리케이션 마무리

 

앞 단계에서 bullet과 체력에 대해서만 리플리케이션을 적용했고 OnFire함수를 변경했다. 기존에는 OnFire 함수에서 사운드 재생, 1인칭 3인칭 Fire anim montage를 재생했기 때문에 OnFire함수를 서버에서만 실행되는 RPC 함수로 바꾸게 되면 서버에서만 사운드와 애니메이션이 재생되는 문제가 있다.

 

1인칭 애니메이션 몽타주는 리플리케이션될 필요가 없고, 3인칭 애니메이션 몽타주와 사운드는 서버와 모든 클라이언트에서 관찰되어야 하므로 기존 OnFire내에서 호출되었던 함수들의 위치를 바꾸었다.

 

우선 1인칭 애니메이션 몽타주 재생은 리플리케이션될 필요가 없으므로 OnFire 함수 밖으로 빼낸다. 

 

WeaponComponent.cpp에 Play1PFireMontage 함수를 따로 UFUNCTION으로 만들고

캐릭터의 OnUseItem에 등록하여 캐릭터를 소유한 클라이언트에서만 1인칭 애니메이션 몽타주를 호출할 수 있도록 하였다.

 

3인칭 애니메이션 몽타주와 사운드 재생은 서버와 모든 클라이언트에서 호출될 수 있도록 멀티캐스트 RPC 함수인 Multi_OnFire함수를 만들어 내부에서 호출될 수 있도록 하였다. 구분을 위해 서버 RPC 함수의 이름은 Server_OnFire로 바꾸었고, Server_OnFire 함수에서 BulletActor를 스폰한 이후에 Multi_OnFire 함수를 호출하도록 구현했다. 

 

WeaponComponent에 Multicast RPC 함수를 하나 더 만들었다.

 

체력 UI 적용하기

언리얼에서 UI를 제작하는데 사용되는 다양한 프레임워크 (UMG, Slate HUD)가 있는데 가장 대중적인 UMG를 사용하도록 한다.

 

Bullettime.Build.cs에 UMG 모듈을 사용하겠다고 알려줘야 한다.

 

UserWidget 클래스를 상속받는 C++ 클래스 BullettimePlayerHUD를 생성한다.

UI 작업은 UI 블루프린트 에디터를 이용하여 작업하는 것이 편하므로 BullettimePlayerHUD를 상속받는 블루프린트 클래스를 이후에 상속받아 작업할 예정이다.

UPROPERTY 속성으로 meta = (BindWidget) 을 지정해주면 상속받는 블루프린트에서는 동일한 이름의 위젯(HealthBar)을 꼭 만들어줘야 한다.

 

SetHealth 함수는 최대 체력과 현재 체력을 인수로 받아 퍼센트 값을 HealthBar에 세팅한다.

 

일단 현재 체력을 BullettimeCharacter에서 관리하고 있고, OnHealthUpdate 함수도 정의되어 있으므로 여기에서 직접 SetHealth를 호출하여 체력이 변할 때 프로그레스 바도 변경되도록 한다.

캐릭터에 프로퍼티 두 개를 추가한다. 

PlayerHUDClass 프로퍼티는 HUD로 사용할 클래스

ㄴ 캐릭터 블루프린트 에디터에서 위젯 블루프린트를 지정해 줄 예정

 

PlayerHUD는 PlayerHUDClass로 생성할 인스턴스이다.

 

캐릭터의 BeginPlay함수에서 위젯을 생성한다.

UserWidget은 PlayerController에 소유되어야 하기 때문에 캐릭터의 PlayerController을 찾아 CreateWidget의 인자로 넣어준다.

서버의 캐릭터에서 SetCurrentHealth 함수가 호출되면 CurHealth의 값이 바뀌어 각 클라이언트에 CurHealth의 값이 리플리케이트 되고, RepNotify의 콜백함수를 거쳐 OnHealthUpdate가 실행되면 클라이언트가 조종하는 캐릭터인 경우에만 UI 값을 세팅한다.

 

 BullettimePlayerHUD를 상속받는 BP_PlayerHUD 블루프린트 클래스를 생성하고 다음과 같이 구성했다.

간단하게 Vertical Box 안에 텍스트 하나와 HealthBar 이름을 가진 ProgressBar를 만들어 줬다.

 

마지막으로 캐릭터 블루프린트 에디터에서 위젯 블루프린트를 설정해 주었다.

 

결과

+ Recent posts