언리얼 Interface를 사용할 때 저 둘 중 하나가 붙어있지 않으면?
언리얼에서 인터페이스 함수를 못 가져와서 UFUNCTION
으로 블루프린트에서 사용할 수 있게 해놓더라도
여기저기서 에러가 나는 참사가 벌어진다.
근데 저 두개의 차이가 무엇일까? 그냥 말 그대로 받아들이면 된다.
BlueprintType
말 그대로 타입, 블루프린트에서 가져와서 사용할 수 있는 타입이 될 수 있다는 것이라고 생각하면 된다.
Blueprintable
블루프린트로 만들 수 있다는 뜻이다. C++로 만들어진 인터페이스 클래스를 파생시켜서 블루프린트로 만들 수 있다.
확장할 일이 생기면 이를 사용하면 될 것이다.
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
void DoInteraction();
이렇듯 상호작용 인터페이스를 만든다고 가정했을 때,
C++에서든 블루프린트에서든 구현하여 쓸 수 있도록 하려면 NativeEvnet
를 사용하여야한다.
근데 이 상태에서 C++ 구현 도중 해당 함수를 호출을 그냥 원래 하던 대로 해버리면?
바로 크래시가 나버린다. (이 크래시는 위 예시 인터페이스랑은 무관)
BlueprintNativeEvent
는 바로 호출이 금지되어 있다. 크래시를 읽어보면 Execute를 사용해서 함수를 호출해달라고 한다.
Execute_'함수명'(실행할 오브젝트, 인자1, 2...)
이걸 대신해서 써주어야한다.
그래서 만약에 그냥 C++에서 사용하던 인터페이스가 갑자기 블루프린트에서도 사용이 되어야할 상황이 된다면 이를 유의해야한다.
무지성으로 NativeEvent
를 붙여서 사용을 했다가는 무수한 곳에서 크래시가 터져버린다.
그렇게 바꿔줬다면 모든 호출부에서 Execute로 대체해주던가 아니면
블루프린트에서 사용할 인터페이스 함수를 따로 만들어서 사용하는게 오히려 나을 것이다.
위 크래시는 오늘 프로젝트에서 나타나버린 아주 싱싱한 예시이다..
본래 C++ 클래스에서만 사용하던 함수를 다른 사람이 필요로 의해 블루프린트에서 부를 수 있게 바꾸려다가 벌어진 상황이다.
타 개발자가 인터페이스 내 함수를 건드림으로써 충분히 벌어질 수 있는 상황이다.
만약 이런 상황이 되면 신중히, 해당 파트를 개발한 분에게 묻거나 레퍼런스를 확인해보고 작업을 해야겠다.