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

영매님님의 프로필 이미지
영매님

작성한 질문수

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

9강 캐릭터 공격 구현

해당 예제의 Multicast RPC에 대한 질문

해결된 질문

작성

·

377

·

수정됨

1

안녕하세요, 강사님 이번 강좌의 Multicast RPC 코드 부분에서 이해되지 않는 것이 있어 여쭈어보고자 합니다.

설명해주신 대로 구현한 결과, 클라이언트 측 화면에서 클라이언트 플레이어가 공격 시 클라이언트 플레이어의 공격 모션이 수행되고, 동시에 서버 측 화면에서도 클라이언트 플레이어의 공격 모션이 수행되고 있습니다. 하지만 코드를 하나하나 따라가보았을 때, 이런 결과가 나오지 않아야 할텐데 라는 생각이 들었습니다.

 

void AABCharacterPlayer::MulticastRPCAttack_Implementation()
{
    AB_LOG(LogABNetwork, Log, TEXT("%s"), TEXT("Begin"));
    if (HasAuthority())
    {
       bCanAttack = false;
       OnRep_CanAttack();

       FTimerHandle Handle;
       GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([&]
            {
                bCanAttack = true;
                OnRep_CanAttack();
            }
       ), AttackTime, false, -1.0f);
    }

    UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
    AnimInstance->Montage_Play(ComboActionMontage);
}

이해되지 않는 부분은 MulticastRPCAttack_Implementation()의 애니메이션 몽타주를 재생하는 코드 부분입니다.

Multicast RPC에 의해서 해당 함수는 서버와 클라이언트 모두에서 실행된다고 이해했습니다. 그렇다면 서버에서는 MulticastRPCAttack_Implementation() 함수의 if문과 애니메이션 몽타주를 재생하는 코드가 모두 실행되게 될텐데요, 그러면 서버쪽에서 호출된 MulticastRPCAttack_Implementation() 함수이므로 서버 측 화면에서는 서버 플레이어의 AnimInstance를 얻어 애니메이션 몽타주를 재생해야 하는 것 아닌가? 라고 생각했으나 실제로 실행 결과는 아시다시피 서버 측 화면의 클라이언트 플레이어의 애니메이션이 재생됩니다. 어째서 제가 생각한 대로 애니메이션이 수행되지 않는 것일까요??

제가 이해되지 않는 이유는 어딘가 잘못 이해하고 있기 때문이라고 생각합니다. 어느 부분을 어떻게 잘못 이해하고 있는 것인지 알고 싶습니다..

 

답변 2

0

영매님님의 프로필 이미지
영매님
질문자

궁금증 해결되었습니다! 감사합니다!

0

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

음.. 현상이 이상하네요.

저는 실행해보니 조작하는 캐릭터의 애니메이션이 서버와 클라에서 제대로 재생됩니다.
한번 깃헙의 예제와 비교해보시겠어요?
https://github.com/ideugu/UnrealProgrammingPart3/tree/9

 

영매님님의 프로필 이미지
영매님
질문자

질문에 약간 오해가 있었던 것 같습니다. 제가 말씀드린 잘못된 동작이 실제로 발생하는 것이 아닌 단순한 저의 생각이었습니다. 설명해주신 대로 정상적으로 동작하는 것이 맞습니다! 코드도 문제 없구요.

 

다만 제가 질문드린 의도는 제가 스스로 코드를 따라가 보았을 때, 서버에서는 MulticastRPCAttack_Implementation() 함수의 if문과 애니메이션 몽타주를 재생하는 코드가 모두 실행되는데, 서버쪽에서 호출된 MulticastRPCAttack_Implementation() 함수이므로 서버 측 화면에서는 서버 플레이어의 AnimInstance를 얻어 애니메이션 몽타주를 재생해야 하는 것 아닌가? 라는 생각이 들었다는 겁니다.

 

예를 들어, 클라이언트 화면에서 클라이언트 플레이어가 공격 시, 클라이언트 화면의 클라이언트 플레이어와 서버 화면의 클라이언트 플레이어가 애니메이션을 수행해야 합니다. 실제로 이는 예제 를 플레이 해보았을 때 보여지지요. 하지만 코드 상으로는 클라이언트 화면에서 클라이언트 플레이어가 공격 시 클라이언트 화면의 클라이언트 플레이어와 서버 화면의 서버 플레이어가 애니메이션을 수행해야 하지 않나 라고 생각한 것입니다. 이러한 저의 생각은 실제 플레이 결과가 말해주듯 잘못된 생각입니다. 그렇기 때문에 제가 코드를 해석하는 과정에서 무언가 잘못된 것이 있다고 생각이 들었고, 어떤 부분을 잘못 이해했기에 잘못된 생각을 하게 된 것인지 궁금한 것이었습니다.

 

어째서 서버 측에서의 MulticastRPCAttack_Implementation() 함수가 수행되고 AnimInstance를 얻어서 해당 AnimInstance의 애니메이션 몽타주를 재생하였는데, 서버 플레이어가 아닌 클라이언트 플레이어의 애니메이션 몽타주가 재생되는 것일까요? 애초에 서버 측에서의 MulticastRPCAttack_Implementation() 함수가 수행하여 AnimInstance를 가져올 때, 가져온 AnimInstance가 서버 플레이어의 AnimInstance가 아닌 클라이언트 플레이어의 AnimInstance인 것인가요?

 

 

 

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

네 맞습니다.

서버는 스탠드 얼론 게임과 완벽하게 호환된다고 생각해주세요.

서버에는 모든 플레이어 캐릭터 및 월드에 대한 정보가 들어있어, 서버 뿐 아니라 다른 플레이어 캐릭터도 서버가 관리합니다. 반면 클라이언트는 일부 허상만 보여줍니다.

클라이언트 캐릭터는 클라이언트가 생성했으니 마치 클라이언트에게 소유권이 있을 거라 생각을 하겠지만, 엄연히 로그인을 통해 서버에 등록을 해야 사용이 가능한 부분입니다.

클라이언트의 역할은 서버가 보내주는 일부 허상 데이터만 받아 렌더링하고 사용자 입력만 캐치해 서버에 보내주는 것에 불과합니다.

클라는 자기와 매칭되는 캐릭터(오너십을 가지는)에 대해서만 명령을 보낼 수가 있습니다. 그리고 직접할 수 있는 건 아무것도 없습니다. 그래서 코드를 분석하면 클라는 서버한테 내 캐릭터에 매핑되는 캐릭터의 애니메이션을 재생해달라고 요청하고, 이를 수락한 서버는 멀티캐스트 RPC를 통해 클라이언트가 허상 캐릭터의 모션을 재생하도록 명령을 내려줍니다.

그래서 실제 게임 로직에 중요한 영향을 미치는 변수 변경은 HasAuthority()가 있는 서버 구문에서만 진행되어야 되는 것이고요.

영매님님의 프로필 이미지
영매님

작성한 질문수

질문하기