Replicated

** [Drag Down] Animation Local Prediction + RPC ** 본문

언리얼 엔진/Drag Down (캡스톤 디자인)

** [Drag Down] Animation Local Prediction + RPC **

라구넹 2025. 4. 30. 17:20
void UDDGA_ActionBase::PlayAnim(FName SectionName)
{
	FScopedPredictionWindow ScopedPrediction(ASC, !AvatarCharacter->HasAuthority());

	// for anim local prediction
	MontageTask = UAbilityTask_PlayMontageAndWait::CreatePlayMontageAndWaitProxy(
		this,
		TEXT("ActionMontage"),
		ActionMontage,
		1.0f,
		SectionName,
		true);

	MontageTask->ReadyForActivation(); 

	// for other client's fast anim sync
	if (AvatarCharacter && ASC)
	{
		AvatarCharacter->NetMulticastPlayOtherClientMontage(ActionMontage, SectionName);
	}
}

자기 자신은 UAbilityTask_PlayMontageAndWait로 로컬 프레딕션,

다른 클라이언트는 RPC로 빠르게 동기화한다

 

void ADDCharacterBase::NetMulticastPlayOtherClientMontage_Implementation(UAnimMontage* Montage, FName SectionName)
{
	if (IsLocallyControlled()) return;

	UE_LOG(LogDD, Display, TEXT("[NetMode : %d] NetMulticastPlayAnimMontage_Implementation"), GetWorld()->GetNetMode());
	if ( GetMesh() && GetMesh()->GetAnimInstance() )
	{
		GetMesh()->GetAnimInstance()->Montage_Play(Montage, 1.0f);
		if (!SectionName.IsNone()) 
		{
			GetMesh()->GetAnimInstance()->Montage_JumpToSection(SectionName, Montage);
		}
	}
}

RPC는 로컬 컨트롤러는 리턴시킨다

 

GAS의 철학을 최대한 지키되, 성능은 유지하고자 하였다.