[UE5] Longvinter 모작 - 멀티플레이어 동기화 테스트

·2023년 3월 1일

UE5

목록 보기
2/5
post-thumbnail

멀티플레이어 이동에 따른 동기화 테스트

🌱 과정

(1) Player 이동을 위한 축 매핑 키 생성 (전, 후, 좌, 우)
(2) 멀티플레이어 옵션 변경

(3) 한 플레이어가 이동했을 때 다른 플레이어 화면에 적용되는지 확인

🌱 결과

이상 없음

  • 아무 표시 없는 캐릭터 : Player0
  • 빨간 네모로 표시한 캐릭터 : Player1
  • 왼쪽 화면 : Player0 화면 / 오른쪽 화면 : Player1 화면

↑ 시작 화면

↑ Player1을 왼쪽으로 이동

↑ Player0을 오른쪽으로 이동

RPC, Replicated 테스트

Longvinter는 PVP가 가능하므로 Client들간에 HP 동기화가 필요

🌱 과정

(1) 현재 구조 확인

HP는 PC와 특정 NPC(나무, 새 등)도 적용되는 내용이므로 CharacterBase에 RPC, Replicated 구현 필요

(2) 함수 구현

// 주요 멤버 변수, 함수

// ACharacterBase.h
	UPROPERTY(ReplicatedUsing = OnRep_CurrentHealth)
	float CurrentHealth;

// ACharacterBase.cppp
	void ACharacterBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
	{
		Super::GetLifetimeReplicatedProps(OutLifetimeProps);

		DOREPLIFETIME(ACharacterBase, CurrentHealth);
	}
    
    void ACharacterBase::OnRep_CurrentHealth()
	{
    	// AddOnScreenDebugMessage()를 통해 화면에 Player들의 HP를 표출하는 함수
		OnHealthUpdate();
	}

// APlayerCharacterBase.h
	UFUNCTION(Server, Reliable)
	void ServerNormalAttackTest();
    
// APlayerCharacterBase.cpp
	void APlayerCharacterBase::ServerNormalAttackTest_Implementation()
	{
		// ...
        if (CollisionEnable)
		{
			int32	Count = CollisionResult.Num();

			for (int32 i = 0; i < Count; ++i)
			{
				ACharacterBase* Character = Cast<ACharacterBase>(CollisionResult[i].GetActor());

				if (IsValid(Character))
				{
					Character->TakeDamage(1.f, FDamageEvent(), GetController(), this);
				}
			}
		}
	}

(2) 함수 호출 순서

  • 플레이어가 NormalAttack키 입력 -> ServerNormalAttackTest_Implementation() 호출
  • 공격 범위 안에 다른 플레이어가 있는 경우 해당 플레이어의 TakeDamage() 호출
  • TakeDamage() 내부에서 SetCurrentHealth() 호출
  • SetCurrentHealth() 내부에서 OnHealthUpdate() 호출
  • CurrentHealth가 변경되었으니 OnRep_CurrentHealth() 호출 -> 모든 플레이어에 변경된 HP 적용

🌱 결과

이상 없음
Player들의 HP 변화가 모든 Client에게 적용됨을 확인함

  • 왼쪽 화면 : Player0 화면 / 오른쪽 화면 : Player1 화면

0개의 댓글