언리얼 엔진 인터페이스와 아이템 시스템 구현25.02.05

Virus·2025년 2월 5일
0

1. 인터페이스란?

인터페이스(Interface)는 특정 클래스가 반드시 구현해야 할 함수 목록만을 정의한 "계약서" 역할을 한다.

상속과의 차이점:
상속: 부모 클래스의 속성과 기능을 그대로 물려받아 사용할 수 있음.
인터페이스: 함수 원형(시그니처)만 정의하고, 구현은 각 클래스에서 직접 작성해야 함.

사용 장점
결합도 감소: 클래스 간 의존성을 줄이고 유지보수가 용이.
확장성 향상: 새로운 아이템을 쉽게 추가할 수 있음.
다형성 극대화: 다양한 아이템을 하나의 인터페이스로 처리 가능.

2. 인터페이스 정의

아이템이 가져야 할 공통 기능을 IItemInterface로 정의.


#pragma once

#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "IItemInterface.generated.h"

UINTERFACE(MinimalAPI)
class UItemInterface : public UInterface
{
    GENERATED_BODY()
};

class SPARTAPROJECT_API IItemInterface
{
    GENERATED_BODY()

public:
    virtual void OnItemOverlap(AActor* OverlapActor) = 0;
    virtual void OnItemEndOverlap(AActor* OverlapActor) = 0;
    virtual void ActivateItem(AActor* Activator) = 0;
    virtual FName GetItemType() const = 0;
};

UINTERFACE(MinimalAPI): 언리얼 엔진의 리플렉션 시스템과 연동하기 위한 매크로.
= 0; (순수 가상 함수): 반드시 구현해야 하는 함수.

3. 아이템 부모 클래스 구현

인터페이스를 구현한 ABaseItem 클래스.


#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "IItemInterface.h"
#include "BaseItem.generated.h"

UCLASS()
class SPARTARPROJECT_API ABaseItem : public AActor, public IItemInterface
{
    GENERATED_BODY()

public:    
    ABaseItem();
    
protected:
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
    FName ItemType;

    virtual void OnItemOverlap(AActor* OverlapActor) override;
    virtual void OnItemEndOverlap(AActor* OverlapActor) override;
    virtual void ActivateItem(AActor* Activator) override;
    virtual FName GetItemType() const override;
    virtual void DestroyItem();
};

#include "BaseItem.h"

ABaseItem::ABaseItem()
{
    PrimaryActorTick.bCanEverTick = false;
}

void ABaseItem::OnItemOverlap(AActor* OverlapActor) {}
void ABaseItem::OnItemEndOverlap(AActor* OverlapActor) {}
void ABaseItem::ActivateItem(AActor* Activator) {}

FName ABaseItem::GetItemType() const
{
    return ItemType;
}

void ABaseItem::DestroyItem()
{
    Destroy();
}

공통 로직 정의: DestroyItem()으로 아이템 제거.
각 아이템 클래스에서 필요한 함수만 오버라이드 가능.

4. 코인 아이템 구현

1️⃣ 코인 공통 부모 클래스


#pragma once

#include "CoreMinimal.h"
#include "BaseItem.h"
#include "CoinItem.generated.h"

UCLASS()
class SPARTAPROJECT_API ACoinItem : public ABaseItem
{
    GENERATED_BODY()

public:
    ACoinItem();

protected:
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
    int32 PointValue;
};

2️⃣ 큰 코인 (50점)


#pragma once

#include "CoreMinimal.h"
#include "CoinItem.h"
#include "BigCoinItem.generated.h"

UCLASS()
class SPARTAPROJECT_API ABigCoinItem : public ACoinItem
{
    GENERATED_BODY()

public:
    ABigCoinItem();
    virtual void ActivateItem(AActor* Activator) override;
};

#include "BigCoinItem.h"

ABigCoinItem::ABigCoinItem()
{
    PointValue = 50;
    ItemType = "BigCoin";
}

void ABigCoinItem::ActivateItem(AActor* Activator)
{
    DestroyItem();
}

PointValue = 50;로 큰 코인은 50점 획득.
ActivateItem()에서 아이템 소멸 로직만 처리.
3️⃣ 작은 코인 (10점)


#pragma once

#include "CoreMinimal.h"
#include "CoinItem.h"
#include "SmallCoinItem.generated.h"

UCLASS()
class SPARTAPROJECT_API ASmallCoinItem : public ACoinItem
{
    GENERATED_BODY()

public:
    ASmallCoinItem();
    virtual void ActivateItem(AActor* Activator) override;
};

#include "SmallCoinItem.h"

ASmallCoinItem::ASmallCoinItem()
{
    PointValue = 10;
    ItemType = "SmallCoin";
}

void ASmallCoinItem::ActivateItem(AActor* Activator)
{
    DestroyItem();
}

PointValue = 10;으로 작은 코인은 10점 획득.
큰 코인과 로직이 같으나 점수만 다름.

5. 지뢰 및 힐링 아이템

1️⃣ 지뢰 아이템


#pragma once

#include "CoreMinimal.h"
#include "BaseItem.h"
#include "MineItem.generated.h"

UCLASS()
class SPARTAPROJECT_API AMineItem : public ABaseItem
{
    GENERATED_BODY()

public:
    AMineItem();

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Mine")
    float ExplosionDelay;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Mine")
    float ExplosionRadius;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Mine")
    float ExplosionDamage;

    virtual void ActivateItem(AActor* Activator) override;
};

#include "MineItem.h"

AMineItem::AMineItem()
{
    ExplosionDelay = 5.0f;
    ExplosionRadius = 300.0f;
    ExplosionDamage = 30.0f;
    ItemType = "Mine";
}

void AMineItem::ActivateItem(AActor* Activator)
{
    DestroyItem(); // 실제로는 폭발 로직 추가 가능
}

폭발 범위, 데미지, 지연 시간을 조절 가능.
ActivateItem()에서 실제 폭발 효과 추가 가능.
2️⃣ 힐링 아이템


#pragma once

#include "CoreMinimal.h"
#include "BaseItem.h"
#include "HealingItem.generated.h"

UCLASS()
class SPARTAPROJECT_API AHealingItem : public ABaseItem
{
    GENERATED_BODY()

public:
    AHealingItem();

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
    float HealAmount;

    virtual void ActivateItem(AActor* Activator) override;
};

#include "HealingItem.h"

AHealingItem::AHealingItem()
{
    HealAmount = 20.0f;
    ItemType = "Healing";
}

void AHealingItem::ActivateItem(AActor* Activator)
{
    DestroyItem(); // 플레이어 체력 회복 로직 추가 가능
}
HealAmount = 20.0f;으로 20 체력 회복.
ActivateItem()에서 체력 회복 로직 추가 가능.

6. 오늘의 배운 점

인터페이스를 사용하여 다형성을 극대화.
부모 클래스를 만들어 코드 중복 최소화.
각 아이템을 쉽게 추가하고 관리 가능.
ActivateItem()을 활용해 아이템별 고유 동작을 손쉽게 구현.

0개의 댓글

관련 채용 정보