UE4函数标记BlueprintImplementableEvent和BlueprintNativeEvent区别

本文深入探讨了在Unreal Engine 4(UE4)中,如何使用BlueprintImplementableEvent和BlueprintNativeEvent实现蓝图与C++代码的交互。详细讲解了这两种修饰符的区别,包括函数声明、定义及调用方式,以及蓝图如何重写实现这些函数。

/// This function is designed to be overridden by a blueprint.  Do not provide a body for this function;
        /// the autogenerated code will include a thunk that calls ProcessEvent to execute the overridden body.
        BlueprintImplementableEvent,

        /// This function is designed to be overridden by a blueprint, but also has a native implementation.
        /// Provide a body named [FunctionName]_Implementation instead of [FunctionName]; the autogenerated
        /// code will include a thunk that calls the implementation method when necessary.
        BlueprintNativeEvent,
 

BlueprintImplementableEvent:在C++可以声明函数(不能定义,蓝图重写),在C++里调用该函数,蓝图重写实现该函数

BlueprintNativeEvent:在C++可以声明和定义函数,在C++里调用该函数,蓝图重写实现该函数(蓝图可以重写或不重写C++父类函数)

MyTPCharacter.h

函数声明(BlueprintImplementableEvent和BlueprintNativeEvent):


	UFUNCTION(BlueprintImplementableEvent)
		void TestA();

	UFUNCTION(BlueprintImplementableEvent)
		int TestB();

	UFUNCTION(BlueprintImplementableEvent)
		void TestC(const FString& str);

	UFUNCTION(BlueprintImplementableEvent)
		int TestD(const FString& str);

	UFUNCTION(BlueprintNativeEvent)
		void TestE();

	UFUNCTION(BlueprintNativeEvent)
		int TestF();

	UFUNCTION(BlueprintNativeEvent)
		void TestG(const FString& str);

	UFUNCTION(BlueprintNativeEvent)
		int TestH(const FString& str);

MyTPCharacter.cpp

函数定义(BlueprintImplementableEvent不能定义和BlueprintNativeEvent定义):

BlueprintNativeEvent修饰函数定义格式:函数名_Implementation

void AMyTPCharacter::TestE_Implementation()
{
	PrintScreenStr("TestE_Implementation");
}
int AMyTPCharacter::TestF_Implementation()
{
	PrintScreenStr("TestF_Implementation");
	return 1;

}
void AMyTPCharacter::TestG_Implementation(const FString& str)
{
	PrintScreenStr("TestG_Implementation " + str);
	
}
int AMyTPCharacter::TestH_Implementation(const FString& str)
{
	PrintScreenStr("TestH_Implementation " + str);
	return 1;
}

C++调用这些函数:

void AMyTPCharacter::OnRunEvent()
{

	 TestA();
	 TestB();
	 TestC("TestC");
	 TestD("TestC");
	 TestE();
	 TestF();
	 TestG("TestG");
	 TestH("TestH");

}

蓝图可以重写函数:如下图,选中重写实现

 

BlueprintImplementableEvent和BlueprintNativeEvent修饰函数,有返回值和没有返回值区别,如下

BlueprintImplementableEvent和BlueprintNativeEvent修饰函数,是否重写C++父类函数,如下

运行效果:

总结:BlueprintNativeEvent和BlueprintImplementableEvent修饰函数,如果没有函数返回值,那就是类似蓝图事件通知,如果有函数返回值,那就是类似蓝图函数重写;都可以传参和返回值;BlueprintNativeEvent修饰函数在C++有声明和定义实现,在蓝图可以覆写该函数,蓝图是否调用C++定义父类函数;BlueprintNativeEvent修饰函数只有声明,没有定义实现,只能在蓝图重写实现;BlueprintNativeEvent和BlueprintImplementableEvent修饰函数都只能在C++其他函数里调用。

<think>好的,用户现在想了解虚幻引擎C++中函数事件的区别。之前已经讨论过一般编程中的函数事件的区别,现在需要结合Unreal C++的具体情况来回答。 首先,回顾之前的回答,函数是显式调用,处理具体逻辑,而事件是响应外部动作,异步触发。在Unreal C++中,这些概念是否有特殊的实现或术语? 查看用户提供的引用内容: 引用[1]提到了UE4中的C++类结构,包括构造函数、BeginPlayTick函数,这些都是标准的函数,属于主动调用的部分。 引用[2]中的代码示例展示了UPROPERTY物理组件的设置,其中可能有事件处理的机制,比如输入事件的绑定。这里的PhysicalComp的设置可能涉及到组件的事件响应,比如碰撞事件。 引用[3]主要讲UPROPERTY宏的使用,用于在编辑器中暴露属性,这可能与事件绑定有关吗?可能不是直接相关,但说明UE4中的元数据标记,比如UFUNCTION事件声明可能需要类似的宏。 用户的问题集中在Unreal C++中的函数事件区别,可能需要结合UE4特有的机制,比如UFUNCTION宏、委托(Delegates)、事件调度器(Event Dispatchers)以及蓝图交互等。 需要明确几点: 1. UE4中的函数通常用UFUNCTION宏标记,可以暴露给蓝图调用,属于主动调用。 2. 事件在UE4中可能通过委托或事件调度器实现,例如绑定到某个事件,当条件满足时触发,比如输入事件、碰撞事件等。 3. 事件可能涉及多播委托,允许多个订阅者响应,而函数通常是单一调用。 需要区分UE4中的RPC(远程过程调用)是否属于事件或函数,比如服务器函数客户端事件。 另外,UE4中的事件可能有不同的声明方式,比如使用BlueprintImplementableEventBlueprintNativeEvent,这些允许在C++中声明事件,在蓝图中实现或覆盖。 还需要考虑事件的异步特性,比如Tick事件每帧自动触发,而函数需要显式调用。 总结回答的结构: - 定义UE4中的函数,使用UFUNCTION,主动调用,暴露给蓝图。 - 定义事件,使用委托或事件调度器,绑定触发机制,异步响应。 - 主要区别:触发方式、执行时机、绑定机制、蓝图交互。 - 代码示例对比,比如普通函数事件调度器的声明。 - 应用场景:函数处理逻辑,事件处理交互或异步通知。 需要确保引用用户提供的参考资料中的内容,比如UPROPERTYUCLASS的使用,但可能引用[2]中的输入事件作为事件的例子,引用[1]中的Tick函数作为事件的例子,因为Tick是每帧自动调用的事件。 需要注意用户提供的引用中是否有错误,例如引用[2]中的代码可能有HTML转义问题,如<>,需要正确显示为<>,但可能在回答中不需要处理,直接引用即可。 最后,生成相关问题,可能需要涉及如何在UE4中声明事件,如何绑定委托,函数参数传递的区别等。</think>### Unreal C++ 中函数与事件的核心区别 在虚幻引擎的C++开发中,函数(**Function**)与事件(**Event**)的设计逻辑与通用编程一致,但通过引擎特有的元数据系统(如`UFUNCTION`、`UPROPERTY`)事件分发机制进一步强化了功能边界。以下是具体分析: --- ### 1. **函数(Function)** #### 定义与特性 - **显式调用**:通过代码直接触发,可包含输入参数返回值。 - **引擎元数据支持**:通过`UFUNCTION`宏暴露给蓝图或反射系统,例如: ```cpp UFUNCTION(BlueprintCallable, Category="Movement") void Jump(float Height); // 蓝图可调用的函数 ``` - **同步执行**:调用后立即执行,例如`BeginPlay()`初始化函数[^1]。 - **作用范围**:处理具体逻辑(如移动、伤害计算)。 #### 应用场景 - 主动触发的行为(如角色跳跃、武器开火) - 工具函数(如数学计算、数据解析) --- ### 2. **事件(Event)** #### 定义与特性 - **被动触发**:依赖外部条件(用户输入、碰撞检测、网络同步)自动执行。 - **委托与绑定机制**:通过`DECLARE_DYNAMIC_MULTICAST_DELEGATE`等宏定义多播委托,例如: ```cpp DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDamageTaken, float, DamageAmount); UPROPERTY(BlueprintAssignable) FOnDamageTaken OnDamageTaken; // 可绑定到蓝图的伤害事件 ``` - **异步响应**:执行时机由引擎控制(如`Tick`事件逐帧触发[^1])。 - **解耦设计**:通过事件分发器(Event Dispatcher)实现模块间通信[^2]。 #### 应用场景 - 用户交互(如按钮点击、键盘输入) - 系统通知(如角色死亡、关卡加载完成) - 网络同步(如RPC事件`ServerFire_Implementation`) --- ### 3. **核心差异对比** | **特性** | **函数** | **事件** | |------------------|--------------------------------------------|--------------------------------------------| | **触发方式** | 代码显式调用(如`Jump(500.0f)`) | 条件满足时自动触发(如碰撞、输入信号) | | **执行控制** | 同步、立即执行 | 异步、延迟执行(如绑定到动画结束回调) | | **蓝图交互** | 通过`BlueprintCallable`暴露为可调用节点 | 通过`BlueprintAssignable`绑定事件响应 | | **代码耦合度** | 高(需直接引用函数) | 低(通过委托解耦) | | **典型用例** | 逻辑计算、状态修改 | 响应输入、物理交互、网络通信 | --- ### 4. **代码示例对比** #### **函数示例** ```cpp // 显式调用的伤害计算函数 UFUNCTION(BlueprintCallable) float CalculateDamage(float BaseDamage, float Defense) { return BaseDamage * (1 - Defense / 100.0f); } ``` #### **事件示例** ```cpp // 碰撞事件绑定(引用[2]的物理组件扩展) UPROPERTY(VisibleAnywhere) USphereComponent* CollisionComponent; // 初始化时绑定事件 AMyActor::AMyActor() { CollisionComponent = CreateDefaultSubobject<USphereComponent>("Collision"); CollisionComponent->OnComponentBeginOverlap.AddDynamic(this, &AMyActor::OnOverlapBegin); } // 事件响应函数 UFUNCTION() void OnOverlapBegin(UPrimitiveComponent* OverlappedComp, AActor* OtherActor) { UE_LOG(LogTemp, Warning, TEXT("Collision with %s"), *OtherActor->GetName()); } ``` --- ### 5. **设计选择建议** - **优先使用函数**:需要精确控制执行顺序或需要返回值的场景(如数学运算)。 - **优先使用事件**:模块间解耦、异步响应(如UI交互、物理反馈)[^3]。 --- ### 相关问题 1. 如何在Unreal C++中实现跨蓝图的事件通信? 2. `BlueprintImplementableEvent``BlueprintNativeEvent`有什么区别? 3. 如何通过事件分发器实现网络同步逻辑?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值