작성
·
258
·
수정됨
0
안녕하십니까. 질문 남기기 앞서 강의 정말 잘 보고 있다고 말씀 드리고 싶습니다.
제가 궁금한 부분은 10번 강의에서 공격에 맞았을 때 검증(Validation) 하는 부분입니다.
bool AABCharacterPlayer::ServerRPCNotifyHit_Validate(const FHitResult& HitResult, float HitCheckTime)
{
return (HitCheckTime - LastAttackStartTime) > AcceptMinCheckTime;
}
공격 시작 타이밍과 몽타주에 배치한 트리거 함수 간의 간격을 검증하기 위한 것으로 이해했습니다.
검증 코드에서 LastAttackStartTime이란 변수가 쓰였고, LastAttackStartTime이란 변수가 아래 코드의 ServerRPCAttack에서 인자로 받은 AttackStartTime 변수로 세팅되는 것을 확인했습니다.
void AABCharacterPlayer::ServerRPCAttack_Implementation(float AttackStartTime)
{
AB_LOG(LogABNetwork, Log, TEXT("%s"), TEXT("Begin"));
bCanAttack = false;
OnRep_CanAttack();
AttackTimeDifference = GetWorld()->GetTimeSeconds() - AttackStartTime;
AB_LOG(LogABNetwork, Log, TEXT("LagTime : %f"), AttackTimeDifference);
AttackTimeDifference = FMath::Clamp(AttackTimeDifference, 0.0f, AttackTime - 0.01f);
FTimerHandle Handle;
GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([&]
{
bCanAttack = true;
OnRep_CanAttack();
}
), AttackTime - AttackTimeDifference, false, -1.0f);
LastAttackStartTime = AttackStartTime;
PlayAttackAnimation();
//MulticastRPCAttack();
for (APlayerController* PlayerController : TActorRange<APlayerController>(GetWorld()))
{
if (PlayerController && GetController() != PlayerController)
{
if(!PlayerController->IsLocalController())
{
AABCharacterPlayer* OtherPlayer = Cast<AABCharacterPlayer>(PlayerController->GetPawn());
if (OtherPlayer)
{
OtherPlayer->ClientRPCPlayAnimation(this);
}
}
}
}
}
LastAttackStartTime은 서버의 변수이고 그렇기 때문에 여러 클라이언트가 동시에 공격을 한다면 LastAttackStartTime이 덮어 씌워질 수 있다고 생각하는데 그렇게 되면 검증하는 부분에서 문제가 생길 수도 있다고 생각합니다.
질문 : 여러 클라이언트가 동시에 공격 시 LastAttackStartTime이 덮어 씌워지는 것이 맞는가?
서버 쪽의 인스턴스들이 각각의 ServerRPC에 대응하여 동작한다.
이 때 멤버 변수의 경우 서버 쪽 인스턴스에서 관리하는 것이고 위의 경우 리플리케이트 되는 변수가 아니기 때문에 서버와 클라이언트 쪽 변수 값이 다를 것이다.
위와 같이 이해했습니다.
아니면 클라이언트 측에선 리플리케이트 되지 않기 때문에 변수가 없다 라고 봐야 할까요 ?