언리얼4 C++ 델리게이트를 이용한 상호작용(Interaction using delegate)
Intro
- 델리게이트를 이용한 상호작용 구현
델리게이트(Delegate)
Delegate의 사전적 의미는 대리자, 대표자이며 C++에서는 지원하지않고 C#에서 지원하는 개념이다.
C++에서의 함수 포인터는 복잡하고 안정성이 떨어지는 방식이었다면 델리게이트는 간편한 문법과 안정성을가진다. 델리게이트의 특징은 이러한 간편함과 안정성 외에도 여러개의 함수를 대표해서 관리할 수 있다는 것이다.
델리게이트는 C++에서는 지원하지않지만 언리얼 C++은 자체 프레임웍을 통해 지원하고있다.
상호작용 추가
상호작용할 액터 추가

상호작용할 액터를 추가하고 오버랩이벤트를 발생시키도록 한다.

오버랩 이벤트가 발생하면 UI 텍스트를 띄우고 오버랩 변수를 true로 변경
상호작용 키 함수 추가
UFUNCTION(BlueprintNativeEvent)
void Interaction();
상호작용 키 F를 눌렀을때 호출될 Interaction 함수를 추가한다. 이때 UFUNCTION(BlueprintNativeEvent) 를 사용하면
블루프린트에서 오버라이드된 함수를 사용할수있으므로 기존에 있던 상호작용(무기줍기) 함수는 블루프린트에서 구현한것을 사용하고 새로운 상호작용(폭격)은 C++에서 작성하기로 했다.
BlueprintNativeEvent를 사용할땐 함수 정의 뒤에 _Implementation를 붙여주어야한다.
void AFPSPlayer::Interaction_Implementation()
블루프린트 수정

기존 Interaction 블루프린트를 새로운 Interaction 함수로 교체한다음 C++에서의 부모 함수도 호출되도록 구성하였다.
전적으로 블루프린트에서 작성될 함수를 선언할때는 BlueprintImplementableEvent 를 사용한다.
델리게이트 사용
GameMode에 여러개의 함수를 바인딩할수 있는 멀티캐스트 델리게이트 선언
DECLARE_MULTICAST_DELEGATE(FStartBomb);
public:
AFPSGameMode();
FStartBomb StartBombing;
실행할 함수들 바인딩
UFUNCTION(BlueprintImplementableEvent, Category = "Fly")
void StartFly();
void AJet::BeginPlay()
{
Super::BeginPlay();
AFPSGameMode* gameMode = Cast<AFPSGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
if (gameMode != nullptr)
{
gameMode->StartBombing.AddUObject(this, &AJet::StartFly);
}
}
전투기는 StartFly 함수를 바인드해준다. 블루프린트에서 구현하기위해 BlueprintImplementableEvnet를 붙여준다.
UFUNCTION(BlueprintImplementableEvent, Category = "Bomb")
void Bomb();
void ABomb::BeginPlay()
{
Super::BeginPlay();
AFPSGameMode* gameMode = Cast<AFPSGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
if (gameMode != nullptr)
{
gameMode->StartBombing.AddUObject(this, &ABomb::Bomb);
}
}
마찬가지로 터지게할 폭탄은 Bomb이라는 함수를 바인드 해준다.
바인드된 함수들 호출
void AFPSPlayer::Interaction_Implementation()
{
if (OverlapRadio)
{
AFPSGameMode* gameMode = Cast<AFPSGameMode>(UGameplayStatics::GetGameMode(GetWorld()));
if (gameMode != nullptr)
{
gameMode->StartBombing.Broadcast();
UE_LOG(LogTemp, Log, TEXT("StartBomb"));
}
}
}
아까 구현했던 Interaction 함수에서 라디오와 오버랩된 상태라면 게임모드에서 델리게이트를 BroadCast 해주어 모든함수를 실행한다.(전투기 출발, 폭발)
블루프린트 함수 구현

전투기는 StartFly 호출시 전투기 소리를 재생시키고 앞으로 비행하도록 구현

MovementMode를 Flying으로 바꾸어주고 속도를 높여줌

폭탄 액터는 수초뒤에 폭발 이펙트와 폭발 사운드를 재생시키고 주변에 RadialDamage를 주도록함
댓글남기기