Unreal Interface

2023. 3. 17. 11:36UnrealEngine/개념

무기의 오버랩 이벤트가 발동할때 오버랩된 액터의 GetHit이라는 함수를 호출하여 오버랩에 반응하도록 하고싶다고 가정해보자.

이럴땐 적 C++ 클래스에 GetHit이라는 함수를 추가해서 무기의 오버랩 이벤트가 발동될때 오버랩된 액터의 GetHit 함수를 호출하면 된다.

그런데 이벤트가 단순히 적 C++ 클래스에 한정하여 작동되는 것이 아니라 부서지는 오브젝트, 고정된 오브젝트, 발사체 등 여러가지 C++ 클래스에 대해서 작동하도록 해야할땐 어떻게 해야할까?

이렇게 유사성이 없는 클래스에 대하여 특정 게임 기능 함수를 공유시키고 싶을때 인터페이스를 사용한다.

 

인터페이스(Interface)는 특정 기능을 구현할 것을 약속한 추상 형식이다.

Java나 C#같은 다른 OOP 언어에선 인터페이스 형식을 따로 제공하고 있지만, C++언어에서는 인터페이스 형식을 제공하고 있지 않다.

그렇다고 해서 구현하지 못하는 것이 아니라 순수 가상 함수들의 구조체를 통해서 구현할 수 있다.

(인터페이스의 멤버 함수들은 public으로 지정하는데 C++ 구조체의 디폴트값이 public임)

언리얼 엔진은 자체적인 인터페이스 클래스를 갖고있기 때문에 해당 클래스를 사용하면 된다.

 

인터페이스 클래스는 일반 언리얼 클래스들과 비슷하지만 두 가지 차이점이 있다.

1. UCLASS가 아닌 UINTERFACE 매크로를 사용하며 UObject가 아닌 UInterface 클래스를 상속한다.

2. UInterface클래스는 실제 인터페이스가 아닌 리플렉션 시스템에 올리기 위한 비어 있는 클래스다. 다른 클래스에 상속되는 실제 인터페이스는 U를 I로 바꾼 하단의 클래스다.

 

이렇게 생성한 인터페이스 클래스의 I로 시작하는 클래스의 public란에 공유시키고 싶은 함수들을 정의해주면 된다.

순수 가상 함수, 혹은 반환같이 사소한 동작이라면 헤더파일에 작성해주고 복잡한 함수는 .cpp 파일에 작성하여 컴파일 시간을 줄이도록 한다.

 

이렇게 만든 언리얼 인터페이스는 사용하고자 하는 C++ 클래스에 상속시켜주면 된다.

아마 대부분 상위 단계의 클래스를 상속하고 있을테니 다중상속을 해준다.

상속을 위해서 인터페이스의 헤더를 해당 클래스의 헤더파일에 추가해줘야한다.

 

그리고 인터페이스에서 정의한 가상함수(GetHit)를 오버라이딩하여 원하는 동작을 구현해준다.

 

 

이렇게 작성한 GetHit를 호출할때는 오브젝트를 상속한 인터페이스로 캐스트하여 호출한다.

인터페이스를 상속했으므로 해당 인터페이스 포인터에 할당이 가능하고

함수를 호출하면 실제로 포인터가 가르키는 클래스에 따라 다른 GetHit이 동작하게 될 것이다.

 

https://djgameprogramming.tistory.com/57

 

상속과 포인터

다음과 같이 두 클래스를 작성하였다. A클래스는 int형 변수 'number'가 존재하고 생성자에서 0으로 초기화한다. print 가상함수는 A라는 것을 보여주고 number를 출력한다. B클래스는 A클래스를 상속한

djgameprogramming.tistory.com

 

'UnrealEngine > 개념' 카테고리의 다른 글

Reflection, Garbage Collection  (0) 2023.06.05
IK 릭 애니메이션 리타기팅  (0) 2023.03.08
Delegate  (0) 2023.03.07
Unreal Foot IK  (0) 2023.03.07
IK(Inverse Kinematic, 역운동학)  (0) 2023.03.07