U++学习笔记 ------ 多播委托 事件委托

多播委托

1、可以绑定多个回调函数,所有绑定的回调函数都会执行,实质是维持了一个单播委托的数组没有返回值支持参数不支持反射以及序列化

绑定多播委托
Add:将函数委托添加 到该多播委托的调用列表中。
AddStatic:添加原始C++指针全局函数委托
AddRaw:添加原始C++指针委托。原始指针不使用任何类型的引用,因此如果从委托下面删除了对象,则调用此函数可能不安全。调用Execute()时请小心!
AddSP:添加基于共享指针的(快速、非线程安全)成员函数委托。共享指针委托保留对对象的弱引用。
AddUObject:添加基于UObject的成员函数委托。UObject委托保留对对象的弱引用。
Remove:从该多播委托的调用列表中删除函数(性能为O(N))。请注意,委托的顺序可能不会被保留!
RemoveAll:从该多播委托的调用列表中删除绑定到指定UserObject的所有函数。请注意,委托的顺序可能不会被保留!

只有动态多播委托才能暴露给蓝图

TestCharacter.h:

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "TestCharacter.generated.h"

UCLASS(config=Game)
class ATestCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	ATestCharacter();

	virtual void EventBegin();

	void output();

	void output1();


};

TestCharacter.cpp:

// Copyright Epic Games, Inc. All Rights Reserved.

#include "TestCharacter.h"
#include "HeadMountedDisplayFunctionLibrary.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "Components/InputComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"

//
// ATestCharacter

ATestCharacter::ATestCharacter()
{
	// Set size for collision capsule
	GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);

	// set our turn rates for input
	BaseTurnRate = 45.f;
	BaseLookUpRate = 45.f;

	// Don't rotate when the controller rotates. Let that just affect the camera.
	bUseControllerRotationPitch = false;
	bUseControllerRotationYaw = false;
	bUseControllerRotationRoll = false;

	// Configure character movement
	GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...	
	GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // ...at this rotation rate
	GetCharacterMovement()->JumpZVelocity = 600.f;
	GetCharacterMovement()->AirControl = 0.2f;

	// Create a camera boom (pulls in towards the player if there is a collision)
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	CameraBoom->SetupAttachment(RootComponent);
	CameraBoom->TargetArmLength = 300.0f; // The camera follows at this distance behind the character	
	CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller

	// Create a follow camera
	FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
	FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
	FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm

	// Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) 
	// are set in the derived blueprint asset named MyCharacter (to avoid direct content references in C++)
}


void ATestCharacter::output() {
	GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Green, TEXT("Sccessful"));
}

void ATestCharacter::output1()
{
	GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Green, TEXT("Sccessful Again"));
}

Delegator.h:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestCharacter.h"
#include "Delegator.generated.h"

DECLARE_MULTICAST_DELEGATE(DeleLoader);

UCLASS()
class TEST_API ADelegator : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ADelegator();

	DeleLoader Binding();

private:
	DeleLoader Dele;

	class ATestCharacter* Testor = nullptr;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

Delegator.cpp:

// Fill out your copyright notice in the Description page of Project Settings.


#include "Delegator.h"
#include "TestCharacter.h"

// Sets default values
ADelegator::ADelegator()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

DeleLoader ADelegator::Binding()
{
	if (Testor == nullptr)	Testor = NewObject<ATestCharacter>();
	Dele.AddUObject(Testor, &ATestCharacter::output);
	Dele.AddUObject(Testor, &ATestCharacter::output1);

	return Dele;
}

// Called when the game starts or when spawned
void ADelegator::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void ADelegator::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

.DelegateInvoker.h:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Delegator.h"
#include "DelegateInvokor.generated.h"



UCLASS()
class TEST_API ADelegateInvokor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ADelegateInvokor();

	UFUNCTION(BlueprintCallable)
	void Invoker();

private:
	ADelegator* Dele = nullptr;

	class ATestCharacter* Testor = nullptr;

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

DelegateInvoker.cpp:

// Fill out your copyright notice in the Description page of Project Settings.


#include "DelegateInvokor.h"
#include "Delegator.h"

// Sets default values
ADelegateInvokor::ADelegateInvokor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}



void ADelegateInvokor::Invoker()
{
	if (Dele == nullptr)	Dele = NewObject<ADelegator>();
	Dele->Binding().Broadcast();
}

// Called when the game starts or when spawned
void ADelegateInvokor::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void ADelegateInvokor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

效果图如下:

总结:可以对多个函数进行绑定执行


学习参考:UE4中的委托及实现原理 - 知乎 (zhihu.com)

事件委托:UE4 C++ 事件_declare_event_刹那天地宽的博客-CSDN博客



DECLARE_EVENT(AMyTriggerVolume, FPlayerEntered)
 
// 实例化一个事件
FPlayerEntered OnPlayerEntered;
 
// 
UFUNCTION()
void OnTriggerEvent();
 
// 绑定函数到事件
OnPlayerEntered.AddUObject(this, &ATriggerVolEventListener::OnTriggerEvent);
 
// 通过调用 Broadcast()使用此事件
OnPlayerEntered.Broadcast();

版权声明:本文为CSDN博主「netyeaxi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/netyeaxi/article/details/81673691 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值