Ue4_C++接口_转载
2022/4/8 9:19:31
本文主要是介绍Ue4_C++接口_转载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
转载官方文档 https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/GameplayArchitecture/Interfaces/
接口有助于确保一组(可能)不想关的类实现一组通用函数。
例如,某个游戏的系统,系统有一个触发器体积可以激活陷阱/警示敌人/向玩家奖励点数
可以对陷阱 敌人和点数奖励器 执行ReactedTrigger 函数实现,然后陷阱可能派生 AActor,敌人可能派生自专门的APawn或ACharacter 子类,点数可能派生自UDataAsset,无Uobject之外共同上级,这种情况推荐使用接口
ReactToTriggerInterface.h #pragma once #include "ReactToTriggerInterface.generated.h" UINTERFACE(MinimalAPI, Blueprintable) class UReactToTriggerInterface : public UInterface { GENERATED_BODY() }; class IReactToTriggerInterface { GENERATED_BODY() public: /** 在此处添加接口函数声明 */ };
前缀为U 的类不需要任何构造或者其他函数,前缀为I的类包含所有的接口函数,且此类将被其他类继承,如想让蓝图实现当前接口,需要Blueprintable 说明符
在c++ 中实现接口
Trap.h #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "ReactToTriggerInterface.h" #include "Trap.generated.h" UCLASS(Blueprintable, Category="MyGame") class ATrap : public AActor, public IReactToTriggerInterface { GENERATED_BODY() public: /** Add interface function overrides here. */ }
仅C++ 的接口函数
ReactToTrigger.h public: virtual bool ReactToTrigger();
ReactToTrigger.cpp bool IReactToTriggerInterface::ReactToTrigger() { return false; }
当一个Actor类实现接口后,可以创建并实现一个针对该类的覆盖
Trap.h public: virtual bool ReactToTrigger() override;
Trap.cpp bool ATrap::ReactToTrigger() { return false; }
这些c++接口未添加表示符 对蓝图不可见
蓝图可调用接口函数
创建蓝图可调用的接口函数,必须带BlueprintCallable ,必须使用BlueprintImplementableEvent
或BlueprintNativeEvent 且函数不能为虚拟的
ReactToTrigger.h public: /**只能在蓝图中实现的React To Trigger版本。*/ UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, Category=Trigger Reaction) bool ReactToTrigger();
ReactToTrigger.h public: /**可以在C++或蓝图中实现的React To Trigger版本。*/ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category=Trigger Reaction) bool ReactToTrigger();
注:NativeEvent 方法在实现需要加 _Implementation() 后缀
确定是否实现了接口
bool bIsImplemented = OriginalObject->GetClass()->ImplementsInterface(UReactToTriggerInterface::StaticClass()); // 如果OriginalObject实现了UReactToTriggerInterface,则bisimplemated将为true。 bIsImplemented = OriginalObject->Implements<UReactToTriggerInterface>(); // 如果OriginalObject实现了UReactToTrigger,bIsImplemented将为true。 IReactToTriggerInterface* ReactingObject = Cast<IReactToTriggerInterface>(OriginalObject); // 如果OriginalObject实现了UReactToTriggerInterface,则ReactingObject将为非空。
转到到其他虚幻类型
支持从一个接口转换到另外一个接口,在适当的情况下从一个接口转换到另外一个虚幻类型
IReactToTriggerInterface* ReactingObject = Cast<IReactToTriggerInterface>(OriginalObject); // 如果接口被实现,则ReactingObject将为非空。 ISomeOtherInterface* DifferentInterface = Cast<ISomeOtherInterface>(ReactingObject); // 如果ReactingObject为非空而且还实现了ISomeOtherInterface,则DifferentInterface将为非空。 AActor* Actor = Cast<AActor>(ReactingObject); // 如果ReactingObject为非空且OriginalObject为AActor或AActor派生的类,则Actor将为非空。
自定义接口简单实现
ReactToTriggerInterface.h #pragma #include "ReactToTriggerInterface.generated.h" UINTERFACE(BlueprintType) class UReactToTriggerInterface :public UInterface { GENERATED_BODY() }; class IReactToTriggerInterface { GENERATED_BODY() public: //pure c++ virtual bool ReactToTriggerFunc_pure(); //NativeEvent UFUNCTION(BlueprintCallable,BlueprintNativeEvent) bool ReactToTriggerNativeFunc(); UFUNCTION(BlueprintCallable, BlueprintImplementableEvent) bool ReactToTriggerBlueprintImpFunc(); };
pawn.h
class ATrace_ProjectCharacter : public ACharacter, public IReactToTriggerInterface { GENERATED_BODY() bool ReactToTriggerFunc_pure(); UFUNCTION(BlueprintCallable,BlueprintNativeEvent) bool ReactToTriggerNativeFunc(); UFUNCTION(BlueprintCallable, BlueprintImplementableEvent) bool ReactToTriggerBlueprintImpFunc(); };
pawn.cpp bool ATrace_ProjectCharacter::ReactToTriggerFunc_pure() { return false; } bool ATrace_ProjectCharacter::ReactToTriggerNativeFunc_Implementation() { return false; }
这篇关于Ue4_C++接口_转载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-05feign默认connecttimeout和readtimeout是多少-icode9专业技术文章分享
- 2024-07-05idea控制台,日志太多,导致部分想看得日志被刷走 搜不到-icode9专业技术文章分享
- 2024-07-05The server selected protocol version Tls10 is not accepted by client preferences [TLs12]-icode9专业技术文章分享
- 2024-07-05怎么清理项目缓存-icode9专业技术文章分享
- 2024-07-04安装 Eyoucms详细图文教程-icode9专业技术文章分享
- 2024-07-04ueditor 复制文章时,图片的链接是一个下载图片地址,该如何处理?-icode9专业技术文章分享
- 2024-07-04怎样判断host有没有对wordpress有缓存呢-icode9专业技术文章分享
- 2024-07-04具有编译功能的系统make后,无法ssh连接-icode9专业技术文章分享
- 2024-07-04make后如何升级ssh-icode9专业技术文章分享
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享