액터의 수명 주기

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/ActorLifecycle/

 

캐릭터의 리스폰이 어떤 절차를 거쳐서 이루어질지 알기 위해 게임플레이 프레임워크와 액터 생성주기를 한 번 짚고 넘어가도록 한다.

 

게임 모드는 다음과 같은 순서로 액터들을 생성하고 배정한다.

 

1. 플레이어 컨트롤러 생성 - AGameMode의 Login에서 SpawnActor 호출

2. 플레이어 폰의 생성 -  Login완료 후 AGameMode의 PostLogin 마지막 부분에서 호출 - 호출을 따라가다 보면 SpawnDefaultPawnAtTransform 안에서 SpawnActor가 호출됨

3. 플레이어 컨트롤러가 플레이어 폰을 빙의 - PostLogin 내부의 함수 호출 트리 마지막 쯤에 FinishRestartPlayer에서 Possess함수 호출

 

세션쪽은 나중에 살펴보겠다

 

변경된 설계

원래 캐릭터의 멤버로 UBullettimePlayerHUD (UUserWidget)를 두었었는데, BullettimePlayerController의 멤버로 옮겼다.

 

이유 : 캐릭터의 경우 캐릭터가 죽고 다시 살아날 때마다 위젯이 생성되고 초기화된다. 플레이어 컨트롤러는 최초 한번 실행되면 게임이 끝날 때 까지 사라지지 않으므로 위젯을 두기에 적절한 위치이다.

 

리스폰

서버에서 피해를 입은 한 캐릭터의 체력이 0 이하가 되면 일어나는 일들

 

서버 측

6초 후에 캐릭터 Destroy() 되도록 타이머 걸기(시체 치우기)

리스폰 함수에 타이머를 걸기 (5초)

킬 데스 점수 처리하기

 

클라이언트측

HealthBar 초기화함수 타이머 걸기 (4초)

카메라 워킹 시작하기 (Timeline을 사용)

1인칭 메시 안보이게하고(Visible 끄기) 3인칭 메시 보이게 하기 (OwnerNoSee false로)

 

양쪽

래그돌 처리, 캡슐 컴포넌트 충돌 끄고 CharacterMovement 끄기

 

5초 후에 호출되도록 설정한 함수는 Client_RespawnCharacter RPC 함수이다.

클라이언트에서 각자의 PlayerController->Server_Respawn RPC 함수를 호출

서버에서 게임모드를 얻어 게임모드의 Server_RespawnRequested 함수를 호출, PlayerController를 인자로 전달

Server_RespawnRequested 내부에서는 캐릭터 생성, 컨트롤러 Possess 시킴

 

 

AGameModeBase::RestartPlayerAtTransform의 존재를 나중에 정리하면서 알게 되었다. 클라이언트의 로그인이 일어날 때 최초로 실행되어 폰을 생성하고 PlayerController를 붙여주는 함수이다.

처음에 캐릭터를 초기화 하는데 사용될 수 있을 뿐만 아니라 캐릭터를 리스폰하는데에도 적절하게 사용될 수 있다는 생각이 들었다. 

 

일단 지금은 기능적으로 문제가 없어서 지금 구현해 놓은 것들을 그대로 두긴 하겠지만 앞으로 온라인 세션에 대해서도 더 많이 다룰 것이기 때문에 기능을 확장해 나감에 따라 앞서 만들어 놓은 것들을 바꿔야 할 때 수정할 생각이다.

 

카메라 워킹

캐릭터가 죽었을 때 Timeline을 사용하여 카메라가 뒤로 서서히 빠지면서 자신의 시체를 볼 수 있도록 했다.

 

캐릭터에 TimeLine 컴포넌트 두 개,  VectorCurve 애셋 두 개를 추가한다. 각각 카메라의 RelativeTransform과 RelativeRotation을 3초에 걸쳐서 부드럽게 변화시킨다.

CurveVector (위치)
TimelineVector 컴포넌트를 사용해 카메라의 움직임을 부드럽게 제어한다.

 

+ Recent posts