캐릭터의 체력을 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 |