강의

멘토링

로드맵

Inflearn brand logo image

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

작성자 없음

작성자 정보가 삭제된 글입니다.

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

10강 캐릭터 공격 구현 개선

ServerRPCAttack_Implementation함수가 이해가 안갑니다.

작성

·

91

0

스크린샷 2024-12-22 203821.png.webp

제가 이해한 되로 정리해봤습니다. 다음 사진처럼
서버 상에서 모든 캐릭터는 Authority / Autonomous 역할을 갖는다고 이해했는데요. 하지만 코드를 보면

for (APlayerController* PlayerController : TActorRange<APlayerController>(GetWorld()))
{
	if (PlayerController && GetController() != PlayerController) //공격 명령을 내린 클라이언트와 대응되는 서버상의 액터를 제외시킴. 
	{
		if (!PlayerController->IsLocalController()) 
		{
			AABCharacterPlayer* OtherPlayer = Cast<AABCharacterPlayer>(PlayerController->GetPawn());
			if (OtherPlayer)
			{
				OtherPlayer->ClientRPCPlayAnimation(this);
			}
		}
	}
}

 

2번째 if문에서 Simulated Proxy 역할을 서버상에서 찾아서 ClientRPCPlayAnimation를 호출시킨다는게
이해가 안 갑니다.
서버에 Simulated Proxy가 없지 않나요?

답변 2

0

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

https://www.inflearn.com/community/questions/1088455
네 동일한 질문이 있으니 참고하시면 될 것 같습니다.
정리하면 두 번째 if문의 경우 서버 머신을 대표하는 플레이어 컨트롤러는 이미 애니메이션을 재생했으니 통신할 필요가 없어 걸렀다고 생각하면 됩니다.

0

안녕하세요, 임성우님. 인프런 AI 인턴입니다.

귀하께서 올려주신 질문은 언리얼 엔진의 네트워크 구조에 대한 이해를 바탕으로 설명드리겠습니다.

언리얼 엔진의 네트워크 시스템에서 각 캐릭터는 서버와 클라이언트 간에 다양한 역할을 가지게 됩니다. 서버는 일반적으로 모든 캐릭터에 대한 Authority 역할을 수행합니다. 즉, 모든 캐릭터에 대한 메인 컨트롤과 데이터 처리가 서버에서 이루어집니다. 하지만 서버에서도 멀티플레이어 게임을 관리할 때 각 클라이언트의 상태를 따라가고 동기화하기 위해 이와 같은 코드 구문을 사용하게 됩니다.

귀하께서 언급한 코드의 IsLocalController() 함수는 클라이언트 측에서의 역할 분배를 확인하는 데 사용됩니다. 이 코드의 목적인 ClientRPC 명령을 적절한 클라이언트에 보내는 것이며, Simulated Proxy는 서버에서 관리되는 각 클라이언트의 상태를 의미합니다.

IsLocalController는 주로 클라이언트가 특정 PlayerController가 로컬 플레이어를 제어하는지 여부를 확인하는 용도로 사용됩니다. 따라서 이 코드는 클라이언트 환경에서 올바른 플레이어에게 명령을 전달하기 위해 작성된 것입니다.

고로, ‘서버에도 Simulated Proxy가 없다’는 관점보다는, 서버가 클라이언트를 먼저 식별하고, 필요 시 해당 클라이언트에게 특정 작업을 전달하기 위해 이렇게 작동한다고 보실 수 있습니다.

이해를 돕기 위해 유사한 질문들에 대한 답변 링크도 제공드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기