UE5) 멀티플레이에서 플레이어 컨트롤러의 Pawn 교체과정

JellyPower·2023년 5월 26일
1

언리얼 메모장

목록 보기
1/4
post-thumbnail
  1. 플레이어가 로그인하면 “서버에서만” Player Possess 과정을 수행한다. 그렇기에 클라이언트에선 OnPossess함수가 호출되지 않고 서버에서만 OnPossess함수가 실행된다.

Why is there no on possessed event for client?

  1. 서버의 OnPossess과정에서 서버는 SetPawn함수를 수행하여 Pawn을 셋한다
void APlayerController::OnPossess(APawn* PawnToPossess)
{
		...
		SetPawn(PawnToPossess);

		...
}
  1. SetPawn을 통해 Pawn을 설정한다.
void APlayerController::SetPawn(APawn* InPawn)
{
...
	Super::SetPawn(InPawn); // APlayerController의 Super는 AController

...
}
void AController::SetPawn(APawn* InPawn)
{
	RemovePawnTickDependency(Pawn);

	Pawn = InPawn;
	Character = (Pawn ? Cast<ACharacter>(Pawn) : NULL);
	// 만약 해당 객체가 Character라면 저장해준다.

	AttachToPawn(Pawn);

	AddPawnTickDependency(Pawn);
}
  1. Pawn변수는 리플리케이션될때 OnRep_Pawn 함수를 실행하여 리플리케이션이 필요한 모든 플레이어 컨트롤러가 Pawn의 값을 바꾸도록 명령한다.
UPROPERTY(replicatedUsing=OnRep_Pawn)
TObjectPtr<APawn> Pawn;
void AController::OnRep_Pawn()
{
	APawn* StrongOldPawn = OldPawn.Get();
	// Detect when pawn changes, so we can NULL out the controller on the old pawn
	if ((StrongOldPawn != nullptr) && (Pawn != StrongOldPawn) && (StrongOldPawn->Controller == this))
	{
		// Set the old controller to NULL, since we are no longer the owner, and can't rely on it replicating to us anymore
		StrongOldPawn->Controller = nullptr;
	}

	OldPawn = Pawn;

	SetPawn(Pawn);
	// 서버에선 이미 실행된 함수, 리플리케이션 노티파이 함수는
    // 서버에서 호출명령은 내려도 서버에선 실제로 실행되지 않는다.

	if (StrongOldPawn != Pawn)
	{
		OnPossessedPawnChanged.Broadcast(StrongOldPawn, Pawn);
	}
}
profile
게임엔진코드싸개(진)

0개의 댓글