언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (13) - HP 시스템 제작 + SRP

ciel45 2023. 12. 23. 12:22

앞서 라인트레이싱으로 적을 맞추는 것을 구현했으므로, 이제 적이 데미지를 받게 할 차례이다.

이에 앞서 소개하고 싶은 소프트웨어 디자인 원칙이 있는데, SRP(Single Responsibility Principle)이다.

단일 책임 원칙으로, 한 클래스는 한 가지 책임만 갖게 하도록 하는 것이다. (역할의 분리)

 

적의 HP에 대한 정보는 물론 적의 성분이므로, Enemy.h에 정의하는게 맞을 수도 있다.

하지만 이후에 프로젝트가 점차 커지게되면, Enemy 클래스는 공격, 행동, HP를 비롯한 스탯 등 많은 여러가지 역할을 맡게될 수 있다. 

 

이렇게 한 클래스가 지나치게 많은 역할, 즉 책임을 맡을 경우 추후 유지보수가 어려워질 수 있다.

 

 

 

 

따라서 스탯 관련 데이터는 별도의 클래스에 구분하도록 하였다.

언리얼 엔진5에서는 ActorComponent를 상속받은 클래스를 만들어, 손쉽게 이를 해결할 수 있다.

ActorComponent란, 말 그대로 Actor에 구성요소로써 붙일 수 있는 클래스를 의미한다.

 

새로운 C++ 클래스 -> 부모 클래스를 Actor Component로

// 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 KANNATPS_API UAttributeComponent : public UActorComponent
{
	GENERATED_BODY()

public:	
	// Sets default values for this component's properties
	UAttributeComponent();

	virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

protected:
	// Called when the game starts
	virtual void BeginPlay() override;

private:
	UPROPERTY(EditAnywhere, Category = "Actor Attributes")
	float CurrentHealth;

	UPROPERTY(EditAnywhere, Category = "Actor Attributes")
	float MaxHealth;
};

UActorComponent를 상속받아서 만든 UAttributeComponent 클래스이다. private 변수로 CurrentHealth, MaxHealth를 저장해두었다.

 

// Enemy.h에서
UPROPERTY(VisibleAnywhere)
UAttributeComponent* Attributes; 

//Enemy.cpp 생성자에서
Attributes = CreateDefaultSubobject<UAttributeComponent>(TEXT("Attributes"));

그리고 Enemy 클래스 헤더 내부에 포인터 변수를 만들고, 생성자에서 컴포넌트를 생성해주었다.

UAttributeComponent 클래스를 달고 있는 모습

 

 

포스팅이 많이 짧은데, 사실 체력바를 만드는 과정까지 적을 예정이었다.

원작 감성을 고려해서 제작한 것이었는데, TPS게임에 체력바가 들어가니 뭔가 안 어울리는 것 같아 그냥 제외하려고 한다.

 

그래서 다음 포스팅에서는 바로 라인트레이싱으로 맞춘 적에게 데미지가 들어가는 기능을 만들 예정이다.