본문 바로가기

Memorize: RECALL

UObject에서 Replication 지원하기

왜 UObject에서 Replication이 필요한가?

 Memorize: RECALL은 최대한 많은 것을 Server에서 처리한다. 그렇기에 모든 Weapon과 Skill 객체들은 Server에만 존재하며, 애니메이션을 플레이하는 등의 Visual적인 부분에만 Multicast를 통해 클라이언트에 호출한다. 여기서 문제가 발생한다. Skill 객체는 Server에만 있는데 어떻게 Multicast를 할 것인가. 난 이를 네트워크 관련 작업을 담당하는 클래스를 따로 두어 해결하였다. 이 기능에 Skill에 필요한 Utility적인 함수를 모아 만들어진 클래스가 SkillContext이다.

 

RPC가 필요한 SkillContext

 

이제 SkillContext를 Actor나 ActorComponent에서 상속받아 Replication만 활성화하면 끝이다. 그러나 나는 UObject에서 상속받고 싶었다. SkillContext에는 Tick 등의 대부분의 기능이 필요하지 않다. 오직 Replication만이 필요하다. 마법을 통해 Replication이 되는 게 아니라면 분명 Replication 기능을 위한 코드가 있을 것이고, 그것을 내가 구현하면 Replication이 될 것이다. 더 싼 값으로! 그래서 UObject에서 Replication을 하는 법을 찾게 되었다.

 

과정

 역시 처음에는 구글링으로 시작했다. UObject RPC을 검색어로 해 검색했더니. 게시글을 볼 수 있었다. 여기서 Replication에 필요한 함수 3개를 알 수 있었다. 이를 통해서 Replication을 지원할 수 있었다. 그러나 Sub-Object에서는 Replication이 불가능하다. 해당 작업 당시에는 Buff라는 또 다른 Replication이 필요한 UObject가 있었고, Buff는 Subobject Replication이 필요했기에, 무언가 더 필요했다. 이번에는 Actor의 소스 코드에 들어가서 Replicate로 검색해봤다. 이를 통해 발견한 함수는 ReplicateSubojects였다. 이름부터 내가 원하는 답을 줄 수 있는 함수라는 느낌이 들었다. 그래서 구현 코드를 확인해보았고, 그 결과 Buff에서 'Channel->ReplicateSuboejct(Subobject, *Bunch, *RepFlags)'를 호출해주면 된다는 사실을 알게 되었다.

 

Actor의 ReplicateSubobjects 코드

 

 마지막으로 Skill Context와 Buff의 중복을 방지하기 위해 NetworkObject라는 부모 클래스를 만들었고, 마침내 UObject에서도 Replication을 지원할 수 있게 되었다.

 

 

NetworkObject의 클래스 정의 코드

 

Network Object의 구현 코드

 

결론

 프로젝트 내적으로는 UObject를 통한 표현의 폭을 넓힐 수 있었고, 외적으로는 리플리케이션에 대해 깊이 공부할 수 있었다. 지금은 Buff 개념의 삭제로 인해 NetworkObject를 상속받는 클래스가 SkillContext 뿐이지만, 추후 같은 상황이 반복될 때 효율적으로 문제를 해결할 수 있게 되었다.