MultiPlayer Fundamentals

박정훈·2025년 3월 27일

언리얼 네트워크

목록 보기
4/7

중복이긴 하지만 제대로 된 이해를 위해..

📌LocalRole

GetLocalRole() 반환값

  • ROLE_None
  • ROLE_Authority
  • ROLE_AutonomousProxy ➡ 둘이 비슷한데 차이가 있음.
    • ROLE_AutonomousProxy: 클라이언트가 직접 제어하는 액터(예: 플레이어 Pawn)로, 입력 처리와 로컬 예측을 수행
  • ROLE_SimulatedProxy ↗
    • ROLE_SimulatedProxy: 클라이언트에서 제어하지 않고 서버가 상태를 업데이트하는 액터

GetLocalRole() == ROLE_Authority ->서버라는 뜻
AActor::HasAuthority 같은 기능

if(GetLocalRole() == ROLE_Authority) //if(HasAuthority())
{
	//it's a Dedicated/Listen Server
}
else
{
	//it's a Client
}

✅Replicates

//h
UPROPERTY(Replicated)
float ReplicatedVar;

void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
//cpp
AMyActor::AMyActor()
{
 	
	PrimaryActorTick.bCanEverTick = true;
	ReplicatedVar = 100.f;
	//bReplicates = true; // 여기에 이렇게 넣어도 됨. 
}

void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	
	SetReplicates(true); // beginplay에는 bReplicates = true 이렇게 넣으면 가끔 동작 안 한다는 듯?
	SetReplicateMovement(true);
}

void AMyActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
	DOREPLIFETIME(AMyActor, ReplicatedVar); //#include "Net/UnrealNetwork.h"
}

이렇게 해주면 기본적인 복제가 된다.

✅RepNotify

//h
UPROPERTY(ReplicatedUsing = OnRep_ReplicatedVar) //이렇게 바꿔주고
float ReplicatedVar;

UFUNCTION()
void OnRep_ReplicatedVar(); //이걸 추가해주면 RepNotify
//cpp
void AMyActor::OnRep_ReplicatedVar()
{
	//do something
}

replicated 속성을 이렇게 바꿔주면 ReplicatedVar 값이 변할 때마다 복제될 때마다 OnRep_ReplicatedVar()가 호출된다.

여기서 주의할 점은, ""c++로 만든 변수의 경우"", 서버에서 실행하면 호스트의 머신에서는 OnRepReplicatedVar() 호출이 되지 않는다. (GPT 왈: 서버(리슨 서버의 호스트 포함)는 권한(authority)을 가지므로 자신이 직접 변경한 변수에 대해 복제 과정을 거치지 않으며, 따라서 OnRep 콜백이 호출되지 않습니다.)

그러므로 리슨 서버일 때는 아래와 같이 추가적인 OnRep_Func() 호출이 필요하다.

void AMyActor::SomeFunction()
{
	if(HasAuthority())
    {
    	ReplicatedVar +=1.f;
        OnRep_ReplicatedVar();
    }
}

✅RPCs

ex)

  • 클라이언트에서 서버로 호출, 실행 on 서버
    • C++(Server), BP(Run on Server)
  • 서버에서 클라이언트로 호출, 실행 on 클라이언트
    • C++(Client), BP(Run on Owning Client)
  • 서버에서 모든 클라이언트로 호출, 실행 on 서버, 모든 클라이언트
    • C++(NetMulticast), BP(Multicast)
UFUNCTION(Server, Reliable)
void ServerRPCTest(float Arg);

UFUNCTION(NetMulticast, Uneliable)
void MulticastRPCFunction(float Arg);

void AMyActor::ServerRPCTest_Implementation(float Arg) // _Implementation 필수
{
}

void AMyActor::MulticastRPCFunction_Implementation(float Arg)
{
}

Server RPC

Client RPC

ownership(누가 소유함?)이 핵심 개념

📌언제 쓰는가?

Replicates는 액터나 변수가 자동 복사되길 원할 때
RepNotify는 Replicates 설정한 객체가 복사되는 순간에 특정 함수를 호출하고 싶을 때
RPCs는 함수가 자동 호출되길 원할 때


tmi
강의에서는 액터의 움직임이 똑같지 않아서 해당 액터의 스태틱메시의 component replicates에 체크해주어서 해결되었다. (물리작용 키는 것도 스태틱 메시)

0개의 댓글