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

심우진님의 프로필 이미지

작성한 질문수

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

10강 캐릭터 공격 구현 개선

10번 강의 질문 있습니다

작성

·

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이 덮어 씌워지는 것이 맞는가?

답변 2

0

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

플레이어 클래스의 멤버 변수이니, 여러 명이 접속한 경우, 해당 변수는 플레이어가 빙의한 인스턴스들이 개별로 관리할 것으로 보여지네요.
강의에서 설명하는 유효성 점검에 대한 내용은, 엄밀해야 하는 실전코드라기보다는, 엔진 구조 학습을 위해 설정된 컨셉 정도로만 봐주시면 좋을 것 같습니다.

심우진님의 프로필 이미지
심우진
질문자

서버 쪽의 인스턴스들이 각각의 ServerRPC에 대응하여 동작한다.

이 때 멤버 변수의 경우 서버 쪽 인스턴스에서 관리하는 것이고 위의 경우 리플리케이트 되는 변수가 아니기 때문에 서버와 클라이언트 쪽 변수 값이 다를 것이다.

 

위와 같이 이해했습니다.

 

아니면 클라이언트 측에선 리플리케이트 되지 않기 때문에 변수가 없다 라고 봐야 할까요 ?

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

네 클라도 같은 클래스를 사용하니 변수는 존재하겠지만 사용하진 않겠죠.

0

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

삭제된 글입니다

심우진님의 프로필 이미지
심우진
질문자

감사합니다. 고민 해결됐습니다. 여러 개의 인스턴스란 단어를 들으니깐 확 이해 되네요..