인터페이스(Interface)는 특정 클래스가 반드시 구현해야 할 함수 목록만을 정의한 "계약서" 역할을 한다.
상속과의 차이점:
상속: 부모 클래스의 속성과 기능을 그대로 물려받아 사용할 수 있음.
인터페이스: 함수 원형(시그니처)만 정의하고, 구현은 각 클래스에서 직접 작성해야 함.
사용 장점
결합도 감소: 클래스 간 의존성을 줄이고 유지보수가 용이.
확장성 향상: 새로운 아이템을 쉽게 추가할 수 있음.
다형성 극대화: 다양한 아이템을 하나의 인터페이스로 처리 가능.
아이템이 가져야 할 공통 기능을 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; (순수 가상 함수): 반드시 구현해야 하는 함수.
인터페이스를 구현한 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()으로 아이템 제거.
각 아이템 클래스에서 필요한 함수만 오버라이드 가능.
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점 획득.
큰 코인과 로직이 같으나 점수만 다름.
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()에서 체력 회복 로직 추가 가능.
인터페이스를 사용하여 다형성을 극대화.
부모 클래스를 만들어 코드 중복 최소화.
각 아이템을 쉽게 추가하고 관리 가능.
ActivateItem()을 활용해 아이템별 고유 동작을 손쉽게 구현.