Game Develop

[UE5] 특정 인터페이스가 구현됐는지 검사할 때 주의할 점 본문

UnrealEngine5/이것저것

[UE5] 특정 인터페이스가 구현됐는지 검사할 때 주의할 점

MaxLevel 2023. 6. 27. 15:51

언리얼에는 특정클래스에 특정인터페이스가 상속되어있는지 확인하는 함수가 있다.

 

spawnedActor->GetClass()->ImplementsInterface(UPoolableActor::StaticClass())

 

 

이 함수를 사용할 때 주의할 점은, 클래스타입만으로 GetClass() 호출 후, ImplementsInterface를 호출하면 false만 리턴한다는 것이다. (실제로 상속받았는데도)

 

예를들어 나같은 경우 블루프린트액터가 아닌 일반액터에 대한 액터풀을 생성하거나 액터풀에서 액터를 꺼내올 때 아래와 같이 액터의 StaticClass만 넘긴다.

 

m_ActorPool->CreateActorPool(AMeleeMinion::StaticClass(),1);

 

그럼 검사를 할 때 AMeleeMinion::StaticClass()->GetClass()->ImplementsInterface(UPoolableActor::StaticClass())

이런식으로 했었는데, 그동안 잘 검사하는 줄 알았다. checkf를 박아놨었기 때문에.. 

근데 오늘 문득 checkf에 false가 아닌 true가 작성되어있는 걸 보고, false로 바꿨더니 바로 크래쉬가 났다.

이게 뭔말이냐면, 무조건적으로 크래쉬나게하려면 checkf에 false를 넣어놔야하는데, 그동안 true라서 검사 잘 안되는 상태였어도 크래쉬가 안 났던 것이다.

 

어쨌든 분명히 인터페이스는 잘 상속되어있고, 실제로 Activate와 DeActivate도 잘 동작하는데 왜 그럴까... 하다가 구글링하니까 보통 검사할 때 StaticClass가 아닌 스폰된 액터로 검사하는걸 확인했다.

그래서 액터풀에서 SpawnActor로 생성한 액터->GetClass()->ImplementsInterface(....)를 호출하니까 true로 잘 리턴됐다.

 

왜 StaticClass로 하면 false만 리턴하는지는 잘 모르겠다. 제발 아는사람이 있으면 댓글 달아줬으면 좋겠다.

 

결론 : 클래스타입으로 인터페이스상속 여부 검사하면 false만 리턴하니까 조심하자.