众所周知,UE4是模块化的架构,因此在使用插件或者自己定义的其他模块时,往往会涉及到跨模块引用函数或者类的情况,在这里进行一些使用记录。下文的项目示例中,UnrealTestCore为主模块,Second为第二个模块。
1. 在Build.cs文件中加入引用
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "Second" });
PrivateDependencyModuleNames.AddRange(new string[] { "Second" });
这里的Second就是主模块需要调用的第二模块。
2. 在需要使用的类中添加头文件
在UnrealTestCore模块中,我创建了一个TestActor类,在TestActor.cpp中我对Second模块进行调用,因此需要在此
#include "Second.h"
3. 调用Second模块的函数
我在Second模块的中定义了两个函数
静态函数TestStaticFunc()
/*Second.h*/
static void TestStaticFunc();
/*Second.cpp*/
void FSecond::TestStaticFunc()
{
UE_LOG(LogTemp, Log, TEXT("Test static function"));
}
普通成员函数TestFunc()
/*Second.h*/
static void TestFunc();
/*Second.cpp*/
void FSecond::TestFunc()
{
UE_LOG(LogTemp, Log, TEXT("Test function"));
}
我在UnrealTestCore模块的TestActor.cpp中分别进行调用
静态函数的调用可以通过【命名空间+::】直接调用,普通成员函数则必须从类的实例化对象中进行调用。
void ATestActor::BeginPlay()
{
Super::BeginPlay();
FSecond::TestStaticFunc();
FSecond& Second = FModuleManager::LoadModuleChecked<FSecond>(FName(TEXT("Second")));
Second.TestStaticFunc();
Second.TestFunc();
}
4. 一些出错点
如果报错
Error LNK2019 'unresolved external symbol'
需要注意调用的模块是否有加?MODULENAME_API,这代表了UE4模块的导出符号
例如我的Second模块,要注意这个模块名要全部大写
class SECOND_API FSecond : public IModuleInterface
加载模块时需要注意传入的模块名不是模块类的类名,即不带F
FSecond& Second = FModuleManager::LoadModuleChecked<FSecond>(FName(TEXT("Second")));
学习不息,继续加油
?
|