일반적인 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으로 바꿔주면 된다. 

 

이렇게 하면 적 머리위에 체력바가 잘 부착되어있는 것을 볼 수 있다.

+ Recent posts