-
카테고리
-
세부 분야
게임 프로그래밍
-
해결 여부
미해결
10번 강의 질문 있습니다
24.01.24 11:22 작성 24.01.24 11:23 수정 조회수 153
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이 덮어 씌워지는 것이 맞는가?
답변을 작성해보세요.
0
이득우
지식공유자2024.01.24
플레이어 클래스의 멤버 변수이니, 여러 명이 접속한 경우, 해당 변수는 플레이어가 빙의한 인스턴스들이 개별로 관리할 것으로 보여지네요.
강의에서 설명하는 유효성 점검에 대한 내용은, 엄밀해야 하는 실전코드라기보다는, 엔진 구조 학습을 위해 설정된 컨셉 정도로만 봐주시면 좋을 것 같습니다.
답변 2