介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
2015-05-21 13:30
1026 查看
这个教程是从UE4Wiki上整理而来.
在C++中直接使用Interface大家应该很熟悉。只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数。像这样的虚函数的基类一般概念上叫接口。那接下来看看UE4中怎样在C++中定义接口的。
.h
.cpp
首先定义一个UTargetInterface这个是给引擎内部模块用的,一般不会用到,但是要定义。
ITargetInterface是你要使用的类,你要声明的函数接口都放在这里面。如果是定义函数给C++用的,那么你就直接按标准的C++声明一个虚函数就OK了,然后你要实现这个接口的子类继承ITargetInterface实现GetHealth函数就可以了。如果是给Blueprint用的,就要在函数前一行声明的UFUNCTION内加上BlueprintImplementableEvent,这样蓝图就可以实现这个接口了,蓝图中就像普通事件一样实现。
.h
.cpp
在C++代码中这样调用.如果是你知道Actor类的实际类型,直接调用就可以了。你不知道Actor的类型时候Interface才有实际的用处。
但是这样的接口蓝图中是无法使用的,蓝图完全无法知道它的存在。你可以再用BlueprintFunctionLibrary的方式再包装一层,但是我觉得这不是很好。
在蓝图中实现Event接口:
之前的NPCActor因为已经继承了ITargetInterface所以,你在蓝图编辑器里可以直接实现OnInteract接口事件。
那如果你纯蓝图的Actor怎么办。
进入蓝图编辑点ClassSettings
在Interfaces面板点Add加入TargetInterface就好了
那怎调用这个蓝图实现的接口在C++里?
看下面的代码
最后一个问题,那如果想要这个函数接口既可以被C++实现又要被Blueprint实现怎么办?
你只要简单的把BlueprintImplementableEvent改成BlueprintNativeEvent就可以了。
.h
.cpp
实现的Actor
.h
SwitchTurned在C++中要实现的函数是virtualvoidSwitchTurned_Implementation(boolbNewOnOrOff,int32CustomParam)override;(BlueprintNativeEvent的函数名字_Implementation)。这个函数也是UHT自动生成的。
如果是你在Blueprint中是实现了SwitchTurned接口,那么C++的实现就会被覆盖隐藏掉。
那如果你的蓝图又要掉用C++接口实现怎么办?
UE4中没有直接实现这样的机制。但是你可以把SwitchTurned_Implementation实现提取出来一个新函数,然后把这个函数定义成UFUNCTION(BlueprintCallable,Category=Interactive),然后在蓝图中调用这个函数就解决了。
好了就介绍到这里,第一次写关于UE4的东西,不对的地方希望大家指正。希望这个对你有帮助。
参考例子:
https://github.com/henrya2/MMWorld
参考文章:
InterfacesAndBlueprints
InterfacesinC++
Exposeaninterfacetoblueprint
在C++中直接使用Interface大家应该很熟悉。只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数。像这样的虚函数的基类一般概念上叫接口。那接下来看看UE4中怎样在C++中定义接口的。
.h
#pragmaonce #include"TargetInterface.generated.h" UINTERFACE(MinimalAPI) classUTargetInterface: publicUInterface { GENERATED_UINTERFACE_BODY() }; classITargetInterface{ GENERATED_IINTERFACE_BODY() public: UFUNCTION(BlueprintImplementableEvent,meta=(FriendlyName="OnInteract")) voidOnInteract(boolbNewOpen); virtualfloatGetHealth(); };
.cpp
#include"YourProject.h" #include"TargetInterface.h" UTargetInterface::UTargetInterface(constFObjectInitializer&ObjectInitializer)
:Super(ObjectInitializer)
{ } //GiveGetHealthadefaultimplementation floatITargetInterface::GetHealth(){ return0.0f; }
首先定义一个UTargetInterface这个是给引擎内部模块用的,一般不会用到,但是要定义。
ITargetInterface是你要使用的类,你要声明的函数接口都放在这里面。如果是定义函数给C++用的,那么你就直接按标准的C++声明一个虚函数就OK了,然后你要实现这个接口的子类继承ITargetInterface实现GetHealth函数就可以了。如果是给Blueprint用的,就要在函数前一行声明的UFUNCTION内加上BlueprintImplementableEvent,这样蓝图就可以实现这个接口了,蓝图中就像普通事件一样实现。
.h
#pragmaonce #include"GameFramework/Actor.h" #include"TargetInterface.h" #include"NPCActor.generated.h" UCLASS() classMMWORLD_APINPCActor
:publicAActor ,publicITargetInterface
{ GENERATED_BODY() public: AInteractiveTargetActor();
virtualfloatGetHealth()override;
protected:
floatHealth;
};
.cpp
#include"YourProject.h" #include"NPCActor.h" NPCActor::NPCActor() { Health=100.0f; } floatNPCActor::GetHealth() { returnHealth; }
在C++代码中这样调用.如果是你知道Actor类的实际类型,直接调用就可以了。你不知道Actor的类型时候Interface才有实际的用处。
autoMyInterface=Cast<ITargetInterface>(ActorInstance);
if(MyInterface)
{
floatActorHealth=MyInterface->GetHealth();
}
但是这样的接口蓝图中是无法使用的,蓝图完全无法知道它的存在。你可以再用BlueprintFunctionLibrary的方式再包装一层,但是我觉得这不是很好。
在蓝图中实现Event接口:
之前的NPCActor因为已经继承了ITargetInterface所以,你在蓝图编辑器里可以直接实现OnInteract接口事件。
那如果你纯蓝图的Actor怎么办。
进入蓝图编辑点ClassSettings
在Interfaces面板点Add加入TargetInterface就好了
那怎调用这个蓝图实现的接口在C++里?
看下面的代码
if(ActorInstance->GetClass()->ImplementsInterface(ITargetInterface::StaticClass()))
{
ITargetInterface::Execute_OnInteract(ActorInstance,true);
}
ActorInstance->GetClass()->ImplementsInterface(ITargetInterface::StaticClass()))是用来判断这个Actor是否实现了TargetInterface,不管是在蓝图还是C++中都可以正确的判断(但是只有BlueprintImplementableEvent和BlueprintNativeEvent(这个后面再介绍)的函数才可以被蓝图实现)。Execute_OnInteract执行蓝图事件,第一个参数是UObject对象(接口调用的执行目标对象),后面的参数就是OnInteract函数的参数。这个函数是UHT自动生成的。其实这个函数本质上就是调用的UObject的ProcessEvent,具体你可以看生成的代码。(你到这个目录下的文件看看就知道了,Yourproject\Intermediate\Build\Win64\Inc\Yourproject\Yourproject.generated.cpp,Yourproject是你的项目名称)
最后一个问题,那如果想要这个函数接口既可以被C++实现又要被Blueprint实现怎么办?
你只要简单的把BlueprintImplementableEvent改成BlueprintNativeEvent就可以了。
.h
#pragmaonce
#include"InteractionsInterface.generated.h"
UINTERFACE()
classMMWORLD_APIUInteractionsInterface:publicUInterface
{
GENERATED_UINTERFACE_BODY()
};
classMMWORLD_APIIInteractionsInterface
{
GENERATED_IINTERFACE_BODY()
public:
UFUNCTION(BlueprintNativeEvent)
voidSwitchTurned(boolbNewOnOrOff,int32CustomParam);
};
.cpp
#include"MMWorld.h"
#include"InteractionsInterface.h"
UInteractionsInterface::UInteractionsInterface(constFObjectInitializer&ObjectInitializer)
:Super(ObjectInitializer)
{
}
实现的Actor
.h
#pragmaonce
#include"GameFramework/Actor.h"
#include"InteractionsInterface.h"
#include"InteractiveTargetActor.generated.h"
UCLASS()
classMMWORLD_APIAInteractiveTargetActor
:publicAActor
,publicIInteractionsInterface
{ GENERATED_BODY() public: AInteractiveTargetActor();
virtualvoidSwitchTurned_Implementation(boolbNewOnOrOff,int32CustomParam)override;
UFUNCTION(BlueprintImplementableEvent,Category=Interactive)
voidSwitchAllTurnedOnOrOff(boolbOnOrOff);
UFUNCTION(BlueprintCallable,Category=Interactive)
boolIsSwitchTurned(int32Index);
UFUNCTION(BlueprintCallable,Category=Interactive)
boolIsSwitchAllTurnedOn();
UFUNCTION(BlueprintCallable,Category=Interactive)
boolIsSwitchAllTurnedOff();
protected:
UPROPERTY(EditAnywhere,BlueprintReadOnly,meta=(ClampMin="1",ClampMax="32",UIMin="1",UIMax="32"))
int32NeedSwitchTurnedNum;
uint32SwitchTurnedStates;
};
SwitchTurned在C++中要实现的函数是virtualvoidSwitchTurned_Implementation(boolbNewOnOrOff,int32CustomParam)override;(BlueprintNativeEvent的函数名字_Implementation)。这个函数也是UHT自动生成的。
如果是你在Blueprint中是实现了SwitchTurned接口,那么C++的实现就会被覆盖隐藏掉。
那如果你的蓝图又要掉用C++接口实现怎么办?
UE4中没有直接实现这样的机制。但是你可以把SwitchTurned_Implementation实现提取出来一个新函数,然后把这个函数定义成UFUNCTION(BlueprintCallable,Category=Interactive),然后在蓝图中调用这个函数就解决了。
好了就介绍到这里,第一次写关于UE4的东西,不对的地方希望大家指正。希望这个对你有帮助。
参考例子:
参考文章:
相关文章推荐
- 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
- 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
- face++ c++接口 以及 curl 库的使用,json库在另一个博客介绍
- UE4-C++核心编程之接口:接口在蓝图中的使用
- 【UNREAL ENGINE 游戏开发】开篇之UE4的BLUEPRINT(蓝图)与C++(新童鞋必看)
- Unreal Engine 4 C++使用注意事项
- Unreal Engine 4 C++ Slate 介绍——Hello Slate
- Unreal Engine 4 C++ Slate 介绍——用C++和Slate创建菜单(二)
- Unreal Engine 4 C++ Slate 介绍——用C++和Slate创建菜单(三)
- Unreal Engine 4 C++ Component介绍——WidgetComponent
- Unreal Engine 4 C++ 插件介绍
- Unreal Engine 4 Gameplay框架介绍
- UE4使用C++创建枚举变量适用于C++与蓝图
- UE4使用C++创建枚举变量适用于C++与蓝图
- ORACLE连接服务器失败,无法使用oci连接其它电脑的 ORACLE服务器等,oci 接口c++封装。
- webview中JavascriptInterface接口在release包中无法使用的问题
- C++智能指针:TR1的 shared_ptr 和 weak_ptr 使用介绍
- Unreal Engine 4 AI (二)用C++和Behavior Tree & Blackboard 实现简单追踪AI
- Java中接口(Interface)的定义和使用
- 使用多文档接口(Multiple Document Interface) 一