상세 컨텐츠

본문 제목

Unreal C++ 기초 6. InterFace 기반 아이템 클래스 생성

Unreal C++

by hyunjunstar 2026. 4. 15. 19:34

본문

1. 인터페이스

인터페이스는 클래스가 반드시 구현해야하는 함수 목록만 정의하는 일종의 계약서다.

인터페이스에서 함수의 틀(이름, 매개변수)만 정의, 실제 동작은 각 클래스에서 직접 구현

상속과 인터페이스의 차이점

  상속 인터페이스
개념 부모 기능 그대로 사용 함수 틀만 정의
구현 부모 코드 사용 가능 직접 구현
목적 기능 공유 규칙 통일

인터페이스의 장점

결합도 감소, 의존도 낮음

 - 다른 클래스의 내부가 어떤식으로 되어있는지 몰라도 함수만 알면 사용이 가능하다

확장성 향상

 - 인터페이스를 구현하여 기존 코드를 수정하지 않고 새로운 기능을 쉽게 추가할 수 있음

다형성 활용 가능

 - 같은 인터페이스를 통해 서로 다른 객체를 동일하게 처리

 - 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

// 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

// 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

// 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()
{
    // 자식 클래스에서 구현 예정
    // 필요시 여기서 구현
}

SmallCoin

생성한 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(); // 아이템 제거
}

BigCoinItem

생성한 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();
}

 

관련글 더보기