내일배움캠프 93일차 - 언리얼 C++ 멀티플레이 팀프로젝트: 미니게임파티 9일차
언리얼엔진5 C++ 기반 멀티플레이 게임 팀 프로젝트 제작
작업내용 요약
관전자 시점에서 입력을 통해 관전자 전환 추가
관전자 전환 기능
플레이어 캐릭터도 컨트롤러 입력을 받았던 것처럼, 관전자 폰도 컨트롤러 입력을 받기 위해 EnhancedInputComponent를 받아 활성화하도록 한다. 단, 관전자 폰은 플레이어 캐릭터가 활동하는 동안에는 사용하지 않으므로 초기에 입력을 막아 놓는다.
당시에 목적은 게임 시작 시 플레이어 캐릭터와 동시에 관전자 폰도 EnhancedInput을 활성화하는 것이었다. 하지만 관전자 폰은 시작 시 컨트롤러 빙의를 받지 않아서 SetupPlayerInputComponent()이벤트가 실행되지 않았다.
과거 7~8일차 당시 나는 관전자 카메라는 나 혼자만 사용하므로 클라이언트 자기자신에서만 스폰하면 된다고 생각하였다. 하지만 이 경우 컨트롤러를 관리하는 서버로부터 관전자 카메라가 Possess를 받을 수 없었고 EnhancedInput도 쓸 수 없었기에 나는 코드를 고칠 수밖에 없었다.
하지만 관전자 카메라를 리플리케이션 액터로 만든다는 것은 트랜스폼 변경을 서버에 맡겨야 한다는 것이고, 이는 위치 갱신 시 지연이 걸릴 수 있다는 것을 의미했다. 그렇다고 클라이언트 측에서 값을 수정하자니 서버의 값으로 덮어 씌워지는 러버밴딩 현상이 걸림돌이었다.
| Gemini의 제안 |
나는 여기서 "관전자 카메라의 이동만 리플리케이트를 적용하지 않는 방법이 있나?" 라고 Gemini에게 질문해보았더니, 이는 SetReplicateMovement(false)를 통해 가능하다는 답변을 받았다. 그리고 이 함수는 런타임중에 실행이 가능하여 원하는 타이밍에 위치를 리플리케이션해 서버와 동기화할 수 있다고 한다.
나는 이 정보를 토대로 관전자 폰의 ReplicateMovement 값을 false로 지정하고, 관전자 카메라 함수 DeathCamFollowCharacter()를 클라이언트만 접근하여 트랜스폼 값을 변경할 수 있도록 HasAuthority()==false를 조건문에 적용하는 것으로 이 문제를 해결하였다.
또한, 이제부터 관전자 폰은 서버로부터 복제되는 리플리케이션 액터이므로 복제된 객체를 클라이언트에서 참조할 필요가 있었다.
그 문제에 대해서는 각 클라이언트에서 관전자 폰을 생성할 때 ServerRPC를 통해 스폰하면서 리플리케이션 변수와 함께 참조값을 받는 것으로 해결하였다.
댓글
댓글 쓰기