구글링과 AI의 도움을 받은 글입니다.

서론 - 인터페이스를 공부하게된 이유

언리얼에서 상호작용 할 수 있는 상자를 만들려고 했다.

그런데 게임을 만들면 상호작용할 수 있는 오브젝트를 매우 여러가지 만들 것이니 그러한 모든 오브젝트가 기본적으로 가져야할 기능들을 통합시키는게 좋지 않을까? 하는 생각이 들었다. 처음에는 Interactable Component 라는걸 만들어서 블루프린트 컴포넌트로 상자나 문에 컴포넌트를 붙이는 식으로 하면 되지 않을까? 했는데 영 아닌것 같아서 gpt에게 물어봤다. 그러니 언리얼의 Interface를 사용하는 방법을 추천하여 공부하게 됐다.


c++의 인터페이스

c++ 인터페이스는 클래스를 상속받은 클래스에서 해당 함수를 반드시 구현하도록 강제하는  방법이다. "이 클래스는 이런 함수를 반드시 만들어야 해" 라는 규정을 박아두는 것.

예를 들어 Animal클래스와 이를 상속받는 Dog, Cat 클래스를 만든다고 할 때 Speak 함수는 강제되어 반드시 구현해야하지만 Sleep은 구현해도 되고 안해도 된다. 일반 가상함수를 구현하지 않으면 부모의 함수를 사용한다. 여기서는 Animal의 Sleep.

class Animal
{
public:
    // 추상 함수 (순수 가상 함수)
    virtual void Speak() = 0;

    // 일반 가상 함수
    virtual void Sleep()
    {
        std::cout << "ZZZ\n";
    }
};

class Cat : public Animal
{
	virtual void Speak() override { std::cout << "Miao\n"; }
};

class Dog : public Animal
{
	virtual void Speak() override { std::cout << "Baw\n"; }
    virtual void Sleep() override { std::cout << "Grrrrrrrr\n"; }
};

 

언리얼의 인터페이스

언리얼에디터에서 C++클래스를 만들 때 언리얼 인터페이스 를 만들 수 있다.

 

생성해보면 두개의 클래스가 구현되어있다. (Interactable 은 내가 지은 이름)

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

/**
 * 
 */
class PROJECT_ISLAND_API IInteractable
{
	GENERATED_BODY()

	// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
};

이 중 위엣거는 언리얼 엔진에서 필요해서 있는거고, 우리가 사용할 실제 c++ 인터페이스는 아래의 IInteractable 클래스이다. 이곳에 상호작용 가능한 것이면 마땅히 있어야할 규정들을 만들어두고, 상호작용 되는 오브젝트들의 클래스에서 상속받고, 거기서 함수를 구현하는 것.

적고나니 없어도 구현이 불가능한건 아닌데 규정이라는게 "상호작용 가능하면 ~~는 만들어야지" 하고 정하는 것이니 어찌보면 개발자의 실수를 막는 도구라고 볼 수 있을 것 같다.

/*...*/
#include "Interactable.h"
#include "Chest.generated.h"


UCLASS()
class PROJECT_ISLAND_API AChest : public AActor, public IInteractable
{
/*...*/
public: 
/*...*/
    virtual void Interact(AActor* Interactor) override;
};

void AChest::Interact(AActor* Interactor)
{
}

 

 

'공부 > 언리얼' 카테고리의 다른 글

블렌더에서 만든 캐릭터 언리얼에서 사용하기  (0) 2025.09.27
자주 쓰는 함수들  (0) 2024.12.04

+ Recent posts