UE4之单播委托

参考:

https://docs.unrealengine.com/zh-CN/Programming/UnrealArchitecture/Reference/Functions/index.html

https://docs.unrealengine.com/zh-CN/Programming/UnrealArchitecture/Delegates/Dynamic/index.html

 

实现一个简单的demo,主要通过拉近拉远来实现灯光的控制。

实现逻辑如下:

 定义一个委托:

这里我定义的是一个有参数的委托

DECLARE_DELEGATE_OneParam(MyDelegate,bool)
/**
 * 
 */
UCLASS()
class TARRAYTEST_API ATArrayTestGameModeBase : public AGameModeBase
{
	GENERATED_BODY()
	
public:
	MyDelegate myDelegate;
};

实现触发函数:这里主要通过ExecuteIfBound在调用委托

void AMyTrigger::NotifyActorBeginOverlap(AActor* OtherActor)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%s is entered me!"), *(OtherActor->GetName())));
	UWorld* TheWorld = GetWorld();
	if (TheWorld != nullptr)
	{
		AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
		ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
		if (nullptr != MyGameMode)
		{
			MyGameMode->myDelegate.ExecuteIfBound(true);
		}
	}
}
void AMyTrigger::NotifyActorEndOverlap(AActor* OtherActor)
{
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT("%s is leaving me!"), *(OtherActor->GetName())));
	UWorld* TheWorld = GetWorld();
	if (TheWorld != nullptr)
	{
		AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
		ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
		if (nullptr != MyGameMode)
		{
			MyGameMode->myDelegate.ExecuteIfBound(false);
		}
	}
}

 绑定委托:

void ATriggerListener::BeginPlay()
{
	Super::BeginPlay();
	UWorld* TheWorld = GetWorld();
	if (TheWorld != nullptr)
	{
		AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
		ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
		if (nullptr != MyGameMode)
		{
			MyGameMode->myDelegate.BindUObject(this,&ATriggerListener::EnableLight);
		}
	}
}

 

解绑委托

void ATriggerListener::EndPlay(EEndPlayReason::Type EEndPlayReason)
{
	UWorld* TheWorld = GetWorld();
	if (TheWorld != nullptr)
	{
		AGameModeBase* GameMode = Cast<AGameModeBase>(UGameplayStatics::GetGameMode(TheWorld));
		ATArrayTestGameModeBase* MyGameMode = Cast<ATArrayTestGameModeBase>(GameMode);
		if (nullptr != MyGameMode)
		{
			MyGameMode->myDelegate.Unbind();
		}
	}
}

委托的实现函数:

void ATriggerListener::EnableLight(bool Enable)
{
	PointLight->SetVisibility(Enable);
}

 

另外能赋值给委托的函数,需要加上UFUNCTION() 

看我的定义:

	UFUNCTION()
	void EnableLight(bool Enable);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值