인프런 커뮤니티 질문&답변

초보언리얼님의 프로필 이미지
초보언리얼

작성한 질문수

이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해

10강 캐릭터 공격 구현 개선

10강 내용에 대해서 질문드립니다.

작성

·

358

·

수정됨

0

안녕하세요 이득우님.

이전에 다른분이 남겨주신 내용과 위치가 같은데요,

380번째줄, void AABCharacterPlayer::ServerRPCAttack_Implementation(float AttackStartTime) 함수에 대한 질문이 있습니다.

 

수업을 위해서 401번째줄에 if(!PlayerController->IsLocalController()) 조건문을 넣어주신것 같아보이긴 하는데, 사실 엄밀하게는, 이 조건문은 아예 없어도 전혀 문제되지 않는 로직이라고 생각되는데 제가 잘못 생각한걸까요? 좀 찝찝하기도 해서, 혹시 제가 놓친게 있나 싶어서 질문 남깁니다.

 

위 조건문이 없어도 되는 이유는, 해당 로직이 있는 곳은 클라이언트에서는 절대 동작할 수 없는 Server RPC 함수 내부 코드이며, 그렇기 때문에 서버에서만 동작하는 상태가 보장되고, 추가로 서버에 있는 모든 PlayerController는 서버 클라이언트 서버 모델에서 항상 IsLocalController가 false가 되기 때문이라고 생각하였습니다.

다른분의 질문에서 올려주신 IsLocalController 함수는 AController의 함수로 올려주셨는데, 저희가 사용하는 Controller는 현재 형변환에 의해 PlayerController이고, 언리얼에서 함수 호출을 살펴보면, PlayerController의 IsLocalController이 호출되는것 같습니다. 그래서 위의 로직에서

if (NetMode == NM_DedicatedServer)

return false;

에 의해 false가 항상 반환될거 같은데, 혹시 제가 놓친 부분이 있을까요?

=> 혼자 고민을 이것저것 해보고 테스트 해보면서, 아마도 이렇게 해주신 이유는 Listen 서버이기 때문에 그런것 같네요. 리슨서버에서는 리슨서버의 PlayerController가 bIsLocalPlayerController가 true가 나오더군요. 그럼에도 불구하고, 일반적으로 데디케이티드 서버 환경에서는 리슨서버를 생각하지 않기 때문에 위 조건문은 필요없을것으로 생각됩니다. 게임 환경을 Client로 바꿔서 사용하였을때를 생각해보았습니다.

 

그리고 추가로 질문이 하나 더 있습니다.

강의에서 Multicast 방식을 각각의 Controller에 대해 Client RPC를 사용해주면서 네트워크 최적화를 설명하신것에 대해서, 저는 이 부분을 멀티캐스트 하나를 사용하는것과 월드 내에 모든 클라이언트에 해당하는 Controller에게 직접 Client RPC를 직접 각각 호출해주는게 좀더 네트워크 성능상 좋다, 라고 이해했는데, 이 부분은 제가 올바르게 이해한게 맞을까요?

 

언제나 좋은 강의 해주시고, 질문도 꼼꼼하게 달아주셔서 감사드립니다(_ _)

 

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

네 서버 머신이 클라이언트로도 동작하는 리슨서버이기 때문에 저 로직이 들어간 것이 맞습니다. 자신에게 RPC를 보낼 이유가 없기 때문이지요.
Multicast는 편하지만 가장 무책임한 기능이라고 봅니다. 결국 좋은 서버 프로그래밍이란 조그마한 자원이라도 고민하고 아끼는 것이 핵심이기에, 번거롭지만 저런 방식도 고민해야 한다는 취지에서 설명드렸습니다. 다만 모든 클라이언트에게 RPC를 보내는 것이 Multicast보다 통신방식이 효율적이라는 뜻은 아닙니다.

-1

안녕하세요, 인프런 AI 인턴입니다.

IsLocalController() 관련하여 궁금하신 내용이 있으신 것 같네요. 이득우 강사님이 해당 내용에 대해 답변해주신 게시물을 하나 찾았습니다. 해당 게시물에서도 IsLocalController()의 개념과 사용 상황에 대해 설명하고 있으니, 링크를 통해 자세한 답변을 확인하실 수 있습니다.

질문자님이 참고하시면 좋을 내용으로, 강사님은 IsLocalController()가 true를 반환하는 조건들을 소스 코드와 함께 설명해주셨으며, 특히 네트워크가 연결된 상황에서 로컬 역할이 오토노머스 프록시인 경우 혹은 원격 역할이 오토노머스 프록시가 아니고 로컬 역할이 오쏘리티(서버)인 경우에 해당 함수가 true를 반환한다고 합니다.

자세한 내용은 아래 게시글에서 확인해주세요.

강의를 통해 궁금한 점이 해결되기를 바랍니다.

초보언리얼님의 프로필 이미지
초보언리얼

작성한 질문수

질문하기