BlueprintNativeEvent需要注意的地方

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

BlueprintNativeEvent

注释

    This function is designed to be overridden by a Blueprint, but also has a default native implementation. Declares an additional function named the same as the main function, but with _implementation added to the end, which is where code should be written. The autogenerated code will call the "_Implementation" method if no Blueprint override is found.(原文)

    此函数将由蓝图进行重载,但同时也包含native类的执行。提供一个名称为[FunctionName]_Implementation的函数本体而非[FunctionName];自动生成的代码将包含转换程序,此程序在需要时会调用实施方式。

代码示例

父.h----PickUp.h

//当PickUp被收集调用的方法
	UFUNCTION(BlueprintNativeEvent,Category="PickUp")
	void WasCollected();
	virtual void WasCollected_Implementation();

父.cpp----PickUp.cpp

void APickUp::WasCollected_Implementation()
{
	//获取该对象的名称
	FString PickUpDebugString = GetName();

	//打印
	UE_LOG(LogClass, Log, TEXT("You have collected %s"), *PickUpDebugString);
}

子.h----BatteryPickUp.h

//重写父代码
void WasCollected_Implementation() override;

子.cpp----BatteryPickUp.cpp

void ABatteryPickUp::WasCollected_Implementation()
{
	//先执行父类行为
	Super::WasCollected_Implementation();

	//销毁
	Destroy();
}

在某个类调用

void AGame04_BatteryCharacter::CollectPickUps()
{
    //APickUp即为父类
	APickUp* const TestPickUp;
	TestPickUp->WasCollected();
}

总结    

    总体来说,UFUNCTION(BlueprintNativeEvent)下的函数,只声明,不定义,但是需要在说明一个同名函数,后面加上_implementation并且需要定义。至于为什么,现在还不知道,日后再补。(12/09

补充

功能

    使用UFUNCTION(BlueprintNativeEvent)可以很方便的实现一个按键绑定多个不同事件

原因

    因为它会优先调用继承这个类的蓝图里面的事件(中文:事件WasCollected英文:Event WasCollected)(前提是重写该蓝图事件)

    如果蓝图没有重写该事件,那么就默认调用C++实现的_implementation

实例

为了方便我们将事件WasCollected叫节点1,父类:WasCollected叫节点2

节点1:

    不做说明,因为好像没有什么好说的

节点2:

    它是调用BatteryPickUp里的WasCollected的,而且我们在BatteryPickUp里写了销毁和调用父类PickUpWasCollected,所以这个节点2的作用就是销毁以及调用PickUpWasCollected.

可能在这里有人有疑问,在BatteryPIckUp并没有写WasCollected,为什么可以调用?

emmmmmmmm,其实他调用的都是对应的WasCollected_Implementation(个人理解,有误望指出)

未解之谜

当然你把鼠标停留在节点2或1上它会出现

它们的目标都是PickUp

可能我上面有理解错,他们应该都是调用基类的PickUp里的WasCollected,然后通过某种方式???将WasCollected_Implementation这个函数转化为WasCollected这个函数了吧.

我尝试通过VS2017调试,希望可以跟踪上面这个未解之谜,然而无奈F11无法进入函数内部,各种调试模式都尝试过,但是都没有办法,希望有人可以帮我解答这个问题吧

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看