인터페이스는 클래스가 반드시 구현해야하는 함수 목록만 정의하는 일종의 계약서다.
인터페이스에서 함수의 틀(이름, 매개변수)만 정의, 실제 동작은 각 클래스에서 직접 구현
| 상속 | 인터페이스 | |
| 개념 | 부모 기능 그대로 사용 | 함수 틀만 정의 |
| 구현 | 부모 코드 사용 가능 | 직접 구현 |
| 목적 | 기능 공유 | 규칙 통일 |
결합도 감소, 의존도 낮음
- 다른 클래스의 내부가 어떤식으로 되어있는지 몰라도 함수만 알면 사용이 가능하다
확장성 향상
- 인터페이스를 구현하여 기존 코드를 수정하지 않고 새로운 기능을 쉽게 추가할 수 있음
다형성 활용 가능
- 같은 인터페이스를 통해 서로 다른 객체를 동일하게 처리
- TArray<IItemInterface*> Items;와 같은 인터페이스 포인터 배열로 관리하면,
아이템 종류가 무엇이든 같은 함수를 호출하여 다룰 수 있음
아이템 클래스는 공통적으로 겹침(Overlap), 사용(Activate), 타입 반환 등 동작을 수행하기 때문에,
공통적인 함수를 인터페이스로 구현하면 다른 아이템들을 쉽게 동일한 규칙(함수 시그니처)으로 구현할 수 있음
상단바 Tools 클릭 > New C++ Class 클릭 > C++ Unreal Interface 클릭 > 이름 ItemInterface 지정 후 생성
UINTERFACE(MinimalAPI)
- 언리얼 엔진에서 인터페이스를 리플렉션 시스템에 등록하는 매크로
- 선언을 해줘야 블루프린트나 다른 코드에서 인터페이스를 인식하고 사용할 수 있음
class UItemInterface : public UInterface
- 언리얼에서 관리하는 인터페이스용 UObject
class SPARTA_API IItemInterface
- 우리가 실제로 사용하는 인터페이스
- 순수 가상 함수 형태로 함수를 정의하고 반드시 구현해서 사용해야함
virtual void OnItemOverlap(AActor* OverlapActor) = 0;
- 플레이어가 아이템 범위에 들어왔을때 실행되는 함수
virtual void OnItemEndOverlap(AActor* OverlapActor) = 0;
- 플레이어가 아이템 범위를 벗어났을때 실행되는 함수
virtual void ActivateItem(AActor* Activator) = 0;
- 아이템을 사용했을때 실행되는 함수
virtual FName GetItemType() const = 0;
- 아이템의 종류(타입)을 반환하는 함수
ex) Coin, Mine 등
// ItemInterface.h
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "ItemInterface.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;
};
상단바 Tools 클릭 > New C++ Class > Actor 클릭 > 이름 BaseItem 지정 후 생성
class SPARTARPROJECT_API ABaseItem : public AActor, public IItemInterface
- Actor에 인터페이스 규칙을 따르는 클래스
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
FName ItemType;
- 아이템들(Coin, Mine 등)을 블루프린트 에디터에서 수정 가능하게 지정
// BaseItem.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
// 인터페이스 .h 인클루드
#include "ItemInterface.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;
// IItemInterface에 정의한 함수들을 반드시 구현
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();
};
// BaseItem.cpp
#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();
}
상단바 Tools 클릭 > New C++ Class 클릭 > BaseItem 검색 > BaseItem클릭 > 이름 지정후 생성
Mine, Healing, Coin 생성
// MineItem.h
#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;
};
// MineItem.cpp
#include "MineItem.h"
AMineItem::AMineItem()
{
// 폭발까지 5초
ExplosionDelay = 5.0f;
// 폭발 범위
ExplosionRadius = 300.0f;
// 폭발 데미지
ExplosionDamage = 30.0f;
// 아이템 타입
ItemType = "Mine";
}
void AMineItem::ActivateItem(AActor* Activator)
{
// 실제 구현에서는
// 타이머 시작 > 일정 시간 후 폭발 함수 실행 >
// 범위 내 플레이어 데미지 > 폭발 이펙트 및 사운드 추가 가능
DestroyItem();
}
// HealingItem.h
#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;
};
// HealingItem.cpp
#include "HealingItem.h"
AHealingItem::AHealingItem()
{
// 기본 회복량
HealAmount = 20.0f;
// 아이템 타입
ItemType = "Healing";
}
void AHealingItem::ActivateItem(AActor* Activator)
{
// 실제로는 플레이어 체력 증가 로직 구현
DestroyItem();
}
// CoinItem.h
#pragma once
#include "CoreMinimal.h"
#include "BaseItem.h"
#include "CoinItem.generated.h"
UCLASS()
class SPARTAPROJECT_API ACoinItem : public ABaseItem
{
GENERATED_BODY()
public:
ACoinItem();
protected:
// 코인 획득 시 얻는 점수
// 자식 클래스(SmallCoin, BigCoin)에서 값만 다르게 설정할 예저정
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
int32 PointValue;
};
// CoinItem.cpp
#include "CoinItem.h"
ACoinItem::ACoinItem()
{
// 자식 클래스에서 구현 예정
// 필요시 여기서 구현
}
생성한 CoinItem 클래스 우클릭 > Create C++ class derived from CoinItem 클릭 > 이름 SmallCoin 지정후 생성
// SmallCoinItem.h
#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;
};
// SmallCoinItem.cpp
#include "SmallCoinItem.h"
ASmallCoinItem::ASmallCoinItem()
{
// 작은 코인 점수 설정
PointValue = 10;
ItemType = "SmallCoin";
}
void ASmallCoinItem::ActivateItem(AActor* Activator)
{
// 실제로는 플레이어 점수 증가 로직 들어감
DestroyItem(); // 아이템 제거
}
생성한 CoinItem 클래스 우클릭 > Create C++ class derived from CoinItem 클릭 > 이름 BigCoin 지정후 생성
// BigCoinItem.h
#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;
};
// BigCoin.cpp
#include "BigCoinItem.h"
ABigCoinItem::ABigCoinItem()
{
// 큰 코인 점수
PointValue = 50;
ItemType = "BigCoin";
}
void ABigCoinItem::ActivateItem(AActor* Activator)
{
DestroyItem();
}
| Unreal C++ 기초 8. 아이템 스폰 및 레벨 데이터 구현 (0) | 2026.04.17 |
|---|---|
| Unreal C++ 기초 7. InterFace 기반 아이템 클래스 기능 구현 (0) | 2026.04.16 |
| Pawn 클래스 3D 캐릭터 만들기 (0) | 2026.04.14 |
| Unreal C++ 기초 5. GameMode와 Character 클래스를 활용해서 캐릭터 구현하기 (2) | 2026.04.09 |
| 리플렉션을 활용한 회전발판과 움직이는 장애물 만들기 (1) | 2026.04.08 |