본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 38. C++와 블루프린트에서 설정가능한 함수 만들기



목차

  1. BlueprintNativeEvent

1. BlueprintNativeEvent

 

히트 후 소리를 재생하고 싶다. 히트 반응은 C++에서 구현하지만 사운드는 C++가 아닌 블루프린트에서 설정을 하고 싶다. 이 경우에 어떻게 해야할까?

 

GetHit함수를 C++에서도 구현하고 블루프린트에서도 구현을 하고 싶다. 

 

하지만 현재 GetHit는 블루프린트에서 설정이 불가능하다. 인터페이스에서 상속받고 있는데 인터페이스에서 설정은

public:
	virtual void GetHit(const FVector& ImpactPoint) = 0;

 

UFUNCTION 매크로 조차 존재하지 않는다.

 

그래서 이제 이 함수를 바꿀 필요가 있다. 이제 UFUNCTION 매크로를 추가해주자.

 

public:
	UFUNCTION(BlueprintNativeEvent)
	void GetHit(const FVector& ImpactPoint);

 

BlueprintNativeEvent 속성은 블루프린트와 C++ 모두에서 함수를 다룰 수 있게 해준다.

 

함수의 선언을 자세히 보면 virtual 키워드도 없고 "= 0"도 없는, 다시 말해 더이상 순수가상함수가 아니다. 언리얼엔진에서는 UFUNCTION 매크로를 주면 이 모든 기능을 자동으로 처리해준다.

 

비록 가상함수는 아니지만 여전히 이를 오버라이드 할 수 있으며 그동안 썼던 방식에서 살짝 변해야 한다.

 

GetHit 함수를 오버라이드하고 있는 파일들로 가보자.

 

 

에너미 헤더파일로 들어가면 더이상 가상함수가 아니기 때문에 오버라이드가 되지 않는 것을 볼 수 있다.

 

_Implementation

 

키워드를 함수명 뒤에 붙혀주자.

 

물론 이렇게 하면 cpp 파일도 수정해야 한다.

 

이제 오류가 나는 부분들을 전부 수정해주자.

 

이제 GetHit_Implementation 사용하기 위해서는 함수를 호출하면 되는데 기존에 사용했던 방식으로 호출하지는 못한다고 한다.

 

참고로 현재 호출은 무기 cpp 에서 하고 있으며,

// 생략	
    if (HitResult.GetActor())
	{
		IHitInterface* HitInterace = Cast<IHitInterface>(HitResult.GetActor());
		if (HitInterace)
		{
			HitInterace->GetHit(HitResult.ImpactPoint);
		}
// 생략

 

이러한 방식으로 호출하고 있었다.

 

이제 이렇게 직접 호출하는 것이 아닌,

 

Execute를 사용하면 된다.

BlueprintNativeEvent 함수를 만들때 자동으로 만들어준 함수라고 한다.

 

함수를 만들면 매개변수가 조금 다른 것을 볼 수 있다. UObject가 매배변수로 추가되어있는데 여기서 객체는 해당 함수를 실행할 객체를 말한다.

 

여기서 함수를 실행할 객체는 타격받는 객체가 될 것이다.

 

 

이제 이렇게 설정해주면 된다. 위에는 처음에 인터페이스 함수를 호출했던 방식이고 밑은 이제 새롭게 바뀐 인터페이스 호출 방식이다.

위엣 부분은 필요없으니 이제 지우도록 하자.

 

IHitInterface* HitInterace = Cast<IHitInterface>(HitResult.GetActor());
if (HitInterace)
{
	HitInterace->Execute_GetHit(HitResult.GetActor(), HitResult.ImpactPoint);
}

 

이제 이렇게 하면 C++에서도 설정하고 블루프린트에서도 설정할 수 있는 함수의 호출이 완료된다.

 

이제 컴파일 하고 에디터로 들어가보자.

 

 

블루프린트에서 정상적으로 함수를 호출할 수 있는 것을 볼 수 있다. 현재 이 함수는 블루프린트에서 설정한 함수이고 C++ 버전도 호출할 수 있다.

 

 

우클릭하면 부모 함수를 호출할 수 있는데 C++ 함수를 말한다.

 

 

이제 함수도 호출할 수 있으니 이어서 다양한 작업들을 해보도록 하자.