일반적인 RPG게임에서는 체력이나 경험치, 골드량이 존재한다. 이번에는 이러한 요소들을 생성하고 캐릭터 클래스에 추가해보자. 이때 각 요소들은 모아서 Actor Component로 만들어주자.
이를 위해 새로운 C++클래스를 생성해주자. 이때 Actor Component를 베이스로 해서 생성해주자.
일단 우선은 체력만을 가지도록 만들어주자.
AttributeComponent.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "AttributeComponent.generated.h"
UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class SLASH_API UAttributeComponent : public UActorComponent
{
GENERATED_BODY()
public:
UAttributeComponent();
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
protected:
virtual void BeginPlay() override;
private:
UPROPERTY(EditAnywhere,Category="Actor Attributes")
float Health;
UPROPERTY(EditAnywhere, Category = "Actor Attributes")
float MaxHealth;
};
이렇게 만든 클래스를 일단 적 클래스에 적용시켜보자.
헤더파일에 추가한 다음 생성될 때 컴포넌트로 생성되도록하자.
Enemy.h
private:
UPROPERTY(VisibleAnywhere)
class UAttributeComponent* Attributes;
Enemy.cpp
#include "Components/AttributeComponent.h"
AEnemy::AEnemy()
{
PrimaryActorTick.bCanEverTick = true;
GetMesh()->SetCollisionObjectType(ECollisionChannel::ECC_WorldDynamic);
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block);
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
GetMesh()->SetGenerateOverlapEvents(true);
GetCapsuleComponent()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
Attributes = CreateDefaultSubobject<UAttributeComponent>(TEXT("Attributes"));
}
이렇게 해주고 핫리로딩해주면 잘 적용되어있는 것을 볼 수 있다.
이때 VisibleAnyWhere로 설정되어있기 때문에 Detail패널을 보고 수정할 수 있다.
이제 적에 머리에 HP바가 달려있도록 구현해보자. 이것은 위젯 컴포넌으로 만들 수 있다.
이렇게 생성해주고 구성은 다음과 같이 해주자
이렇게 해주고 위젯 컴포넌트를 상속받는 C++클래스를 생성해주자.
이렇게 만들어준 다음 이것을 Enemy 클래스에 추가해보자. 이때 WidgetComponent를 사용하려면 빌드파일에 모듈을 추가해줘야한다.
Slash.Build.cs
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","EnhancedInput","HairStrandsCore", "Niagara", "GeometryCollectionEngine", "UMG" });
Enemy.h
private:
UPROPERTY(VisibleAnywhere)
class UWidgetComponent* HealthBarWidget;
Enemy.cpp
AEnemy::AEnemy()
{
PrimaryActorTick.bCanEverTick = true;
GetMesh()->SetCollisionObjectType(ECollisionChannel::ECC_WorldDynamic);
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block);
GetMesh()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
GetMesh()->SetGenerateOverlapEvents(true);
GetCapsuleComponent()->SetCollisionResponseToChannel(ECollisionChannel::ECC_Camera, ECollisionResponse::ECR_Ignore);
Attributes = CreateDefaultSubobject<UAttributeComponent>(TEXT("Attributes"));
HealthBarWidget = CreateDefaultSubobject<UWidgetComponent>(TEXT("HealthBar"));
HealthBarWidget->SetupAttachment(GetRootComponent());
}
이렇게 해주면 BP_Enemy에 체력바를 넣을 수 있는 위젯 컴포넌트가 생긴것을 볼 수 있다. 여기서 만들어둔 체력바를 넣어주고 스페이스를 Screen으로 바꿔주면 된다.
이렇게 하면 적 머리위에 체력바가 잘 부착되어있는 것을 볼 수 있다.
'게임공부 > Unreal Engine' 카테고리의 다른 글
[Unreal Engine][C++]21. Damage (1) | 2025.01.21 |
---|---|
[Unreal Engine][C++]20. Actor Component (0) | 2025.01.16 |
[Unreal Engine][C++]18. Treasure2 (0) | 2025.01.03 |
[Unreal Engine][C++]17. Treasure (0) | 2025.01.03 |
[Unreal Engine][C++]16. Breakable Actors2 (1) | 2025.01.02 |