为什么 InputComponent->BindAxis(TEXT("ViewHorizontalOffSet"),this,&AMarioController::ViewOffset);中的函数不用加UFUNCTION(),而OnComponentBeginOverlap绑定的函数一定要加UFUNCTION()?
在Unreal Engine中,InputComponent->BindAxis和事件绑定(如OnComponentBeginOverlap)使用不同的系统和要求。这些差异导致了在绑定函数时对UFUNCTION()宏的不同需求。
BindAxis和UFUNCTION()宏
BindAxis: 用于绑定输入轴(如游戏手柄的移动或旋转)。当绑定轴输入时,BindAxis函数直接引用成员函数指针来处理输入值。因为这种直接的函数指针绑定发生在编译时,而非运行时,因此不需要UFUNCTION()宏。在C++编译时期,编译器已经知道函数的地址,所以可以直接将其绑定到输入事件。
为什么不需要UFUNCTION():BindAxis对函数的直接指针绑定并不需要函数被Unreal的反射系统所知晓。因此,用于输入绑定的函数不需要标记为UFUNCTION(),这减少了反射系统的开销,并保持了代码的简洁性。
事件绑定(如OnComponentBeginOverlap)和UFUNCTION()宏
事件绑定:如OnComponentBeginOverlap等事件绑定通常需要与Unreal Engine的反射系统交互。这使得引擎在运行时能够识别和调用相应的函数。这种情况下,函数必须使用UFUNCTION()宏进行标记。
UFUNCTION()宏的必要性:标记为UFUNCTION()的函数会被Unreal的反射系统记录,使得这些函数能在运行时被动态调用。这对于响应引擎和编辑器中的事件至关重要,比如物体碰撞、网络复制等。这样的系统设计允许更高的灵活性和动态性,例如在蓝图中调用这些函数。
总结来说,输入绑定(如BindAxis)直接使用函数指针,不需要通过Unreal的反射系统,因此不需要UFUNCTION()宏。而对于需要在运行时通过Unreal Engine的反射系统进行动态调用的事件响应函数(如OnComponentBeginOverlap),则必须使用UFUNCTION()宏来确保它们能被正确识别和调用。