작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
91
0
제가 이해한 되로 정리해봤습니다. 다음 사진처럼
서버 상에서 모든 캐릭터는 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가 없다’는 관점보다는, 서버가 클라이언트를 먼저 식별하고, 필요 시 해당 클라이언트에게 특정 작업을 전달하기 위해 이렇게 작동한다고 보실 수 있습니다.
이해를 돕기 위해 유사한 질문들에 대한 답변 링크도 제공드립니다:
IsLocalController()
함수에 대해 설명하면서, 네트워크 모드와 역할에 따라 반환 값이 달라지는 경우를 다루고 있습니다. 소스 코드와 함께 자세한 설명을 볼 수 있습니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.