애니메이션 동기화
애니메이션 동기화의 경우
일반적으로 Owning Client에서 애니메이션을 선재생하고
Server를 통해 NetMulticast로 모든 클라에서 애니메이션에 재생되도록 구현하는 방식이 일반적이다
그리고 NetMulticast에서 Owning Client와 Server는 실행될 필요가 없다
// SPlayerCharacter.h
...
class STUDYPROJECT_API ASPlayerCharacter : public ASCharacter
{
...
public:
...
private:
...
UFUNCTION(Server, Unreliable)
void PlayAttackMontage_Server();
UFUNCTION(NetMulticast, Unreliable)
void PlayAttackMontage_NetMulticast();
protected:
...
};
// SPlayerCharacter.cpp
...
#include "Kismet/GameplayStatics.h"
#include "Kismet/KismetSystemLibrary.h"
...
void ASPlayerCharacter::TryFire()
{
...
if (IsValid(PlayerController) == true && IsValid(WeaponInstance) == true)
{
...
// 1. Owning Client에서 애니메이션 선재생
UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
if (IsValid(AnimInstance) == true && IsValid(WeaponInstance) == true)
{
if (AnimInstance->Montage_IsPlaying(WeaponInstance->GetRifleFireAnimMontage()) == false)
{
AnimInstance->Montage_Play(WeaponInstance->GetRifleFireAnimMontage());
}
}
// 2. Other Client에서도 재생하기 위해 Server RPC 호출
PlayAttackMontage_Server();
}
}
...
void ASPlayerCharacter::PlayAttackMontage_Server_Implementation()
{
PlayAttackMontage_NetMulticast();
}
void ASPlayerCharacter::PlayAttackMontage_NetMulticast_Implementation()
{
// 3. 서버와 Owning Client를 제외하고 Other Client에서 애니메이션 재생
if (HasAuthority() == false && GetOwner() != UGameplayStatics::GetPlayerController(this, 0))
{
UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
if (IsValid(AnimInstance) == true && IsValid(WeaponInstance) == true)
{
if (AnimInstance->Montage_IsPlaying(WeaponInstance->GetRifleFireAnimMontage()) == false)
{
AnimInstance->Montage_Play(WeaponInstance->GetRifleFireAnimMontage());
}
}
}
}
...
'게임 엔진 > [코드조선] 언리얼 데디서버' 카테고리의 다른 글
게임모드와 게임스테이트 (1) | 2025.03.07 |
---|---|
Replicated, ReplicatedUsing 키워드 (0) | 2025.03.07 |
함수 내부에서의 구분 (0) | 2025.03.07 |
RPC 활용 (0) | 2025.03.07 |
RPC 키워드 사용법 (0) | 2025.03.07 |