Unreal Engine - 데디케이티드 서버 7 (동기화 2)

2025. 4. 12. 00:08·Unreal Engine

캐릭터의 체력을 UI와 연동하는 시스템 구현하기

 

1. 액터 컴포넌트 동기화


1 - 1. 세팅

새롭게 생성한 파일

  • Status Component
    • 캐릭터의 체력을 set하고 get하는 함수들 존재
    • 멀티캐스트 델리게이트를 통해 변수 생성
  • HPWidget
    • Text를 setting 하는 함수와
    • 해당 UI의 Owner에 대한 정보를 가진 변수와 해당 변수를 가져오는 함수 존재
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
TObjectPtr<AActor> OwningActor;
  • HPTextWidgetComponent
    • 연결된 widget을 가져와서 Owner를 통해 초기화 진행
    • 위젯 컴포넌트의 역할?

수정한 로직

  • PlayerCharacter
    • Status Component와 HPTextWidgetComponent 변수 추가 
    • Status Component와 체력관련 변수를 연동 (델리게이트 바인딩)
    • Tick에서 Widget의 위치를 계산
void ADXPlayerCharacter::SetHPTextWidget(UUW_HPText* InHPTextWidget)
{
	UUW_HPText* HPWidget = Cast<UUW_HPText>(InHPTextWidget);
	if (IsValid(HPWidget))
	{
		HPWidget->InitializeHPTextWidget(StatusComponent);
		StatusComponent->OnCurrentHPChanged.AddUObject(HPWidget, &UUW_HPText::OnMaxHPChange);
		StatusComponent->OnMaxHPChanged.AddUObject(HPWidget, &UUW_HPText::OnMaxHPChange);
	}
}

 

문제점

  • 현재 로직상에서는 HP가 서버에서만 계산되고, 그 값이 클라이언트로 리플리케이션 되고있지 않다.
  • 아래 영상에서 콘솔창(서버)에서는 값이 계산되지만, 클라이언트에게 반영되지는 않는다.
  • 해결

 

1 - 2. 액터 컴포넌트 관련 개념

액터와 컴포넌트의 관계

  • 액터가 컴포넌트를 소유하고 있다면, 
  • 액터 입장에서 컴포넌트를 subobject로
  • 컴포넌트 입장에서 액터를 owner라고 한다.

컴포넌트의 이벤트 함수

  • InitializeComponent()
    • 아래 두 함수보다 먼저 호출되는 함수
    • 게임 로직 실행전 필요한 세팅 작업을 작성하기 좋은 부분
  • ReadyForReplication()
    • BeginPlay() 이전에 호출되는 함수
    • 리플리케이션 관련 초기화 작업을 할 때 사용
  • BeginPlay()
    • 초기화가 완료된 후 게임 로직 수행시 사용

 

 

2. 문제 해결


리플리케이트 하지 않았던 변수 두개를 리플리케이트 해주고

변수의 값이 변했을 때 OnRep 함수를 통해 BroadCast 해준다

더보기
더보기
public:
	virtual void GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const override;
protected:
	UFUNCTION()
	void OnRep_CurrentHP();

	UFUNCTION()
	void OnRep_MaxHP();

public:
	UPROPERTY(ReplicatedUsing = OnRep_CurrentHP)
	float CurrentHP;

	UPROPERTY(ReplicatedUsing = OnRep_MaxHP)
	float MaxHP;

 

UDXStatusComponent::UDXStatusComponent()
	:CurrentHP(100.f)
	,MaxHP(100.f)
{
	PrimaryComponentTick.bCanEverTick = false;

	SetIsReplicatedByDefault(true);
}

void UDXStatusComponent::GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME(ThisClass, CurrentHP);
	DOREPLIFETIME(ThisClass, MaxHP);
}

void UDXStatusComponent::OnRep_CurrentHP()
{
	OnCurrentHPChanged.Broadcast(CurrentHP);
}

void UDXStatusComponent::OnRep_MaxHP()
{
	OnMaxHPChanged.Broadcast(MaxHP);
}

 

실행 결과

 

 

3. 추가 개념 정리


3 - 1. 멀티캐스트 델리게이트

https://gbleem.tistory.com/162

 

Unreal Engine - 멀티캐스트 델리게이트

0. 델리게이트델리게이트 공식 문서 언리얼에서의 사용특정 상황이 발생했을 때 다른 객체에게 알려주기 위해서 사용환다.예를 들어,캐릭터의 체력이 0이 되었을 때 UI와 게임모드, 사운드 등에

gbleem.tistory.com

 

3 - 2. 위젯 컴포넌트

'Unreal Engine' 카테고리의 다른 글

UE5 Issues - 리슨 서버 게임 이슈들  (0) 2025.04.18
Unreal Engine - 멀티캐스트 델리게이트  (0) 2025.04.13
Unreal Engine - 데디케이티드 서버 6 (동기화)  (0) 2025.04.11
Unreal Engine - 데디케이티드 서버 5 (RPC, Replication)  (0) 2025.04.10
Unreal Engine - 데디케이티드 서버 4 (RPC)  (0) 2025.04.07
'Unreal Engine' 카테고리의 다른 글
  • UE5 Issues - 리슨 서버 게임 이슈들
  • Unreal Engine - 멀티캐스트 델리게이트
  • Unreal Engine - 데디케이티드 서버 6 (동기화)
  • Unreal Engine - 데디케이티드 서버 5 (RPC, Replication)
gbleem
gbleem
gbleem 님의 블로그 입니다.
  • gbleem
    gbleem 님의 블로그
    gbleem
  • 전체
    오늘
    어제
    • 분류 전체보기 (176)
      • Unreal Engine (66)
      • C++ (19)
      • 알고리즘(코딩테스트) (26)
      • TIL (60)
      • CS (4)
      • 툴 (1)
  • 블로그 메뉴

    • 홈
    • 카테고리
  • 링크

    • 과제용 깃허브
    • 깃허브
    • velog
  • 공지사항

  • 인기 글

  • 태그

    cin함수
    map을 vector로 복사
    addonscreendebugmessage
    DP
    gamestate
    Vector
    싱글턴
    enhanced input system
    character animation
    motion matching
    blend pose
    actor 클래스
    매크로 지정자
    additive animation
    BFS
    상속
    const
    C++
    applydamage
    템플릿
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gbleem
Unreal Engine - 데디케이티드 서버 7 (동기화 2)
상단으로

티스토리툴바