UE4官方Third Person框架初学者见解
以下是我作为一个UE4初学者在观看官方Third Person框架中对这个框架的理解和体会,如果有什么不正确的地方欢迎指正。
1.虚幻中的类前缀你会见到U,A,F,以下就是很好的罗列其中的意义
• U: UObject继承过来的,例如UTexture
• A: AActor继承过来的,例如AGameMode
• F: 其他的类和结构,例如FName, FVector
• T:模板,例如TArray,TMap,TQueue
• I: 接口类,ITransaction
• E:枚举, ESelectionMode
• B: Boolean, bEnabled
2.用宏定义来包裹C++代码
• UCLASS 来包裹类
• USTRUCT 包裹结构
• UFUNCTION 包裹功能
• UPROPERTY 包裹属性
上面这个介绍是我在http://www.cnblogs.com/NEOCSL/p/4059419.html这篇博客中看到的。
对于这两者,我的理解是:
前缀,是用来告诉我们在个类继承自哪里,我们只需要看类的前缀,我们就能知道这个类的父类是什么。
宏,这四个宏,他是UE4引擎用来区分我们自己本身的内部代码(不需要和引擎交互的部分)和需要和引擎蓝互的部分代码。如果你想要在引擎中调用某个C++类,那么你只需要在类前面加入UCLASS(),那么就可以在引擎中调用这个类,至于以下三个同理,如果你需要定义一个蓝图和C++互通的变量,那么你就需要使用UPROPERTY()来包裹他,在括号中可以声明一些属性来确定这些变量是否可以被访问等,这个在后面会提到。
然后我们看到生成这个Third Person游戏框架,他初始有两个类,一个是GameMode类,一个是Character类。
GameMode类,游戏模式,用于管理游戏的规则,以及玩家的生成也是在此类生成。
MyProjectGameMode.h
#pragma once
#include "GameFramework/GameMode.h"
#include "MyProjectGameMode.generated.h"
UCLASS(minimalapi)
class AMyProjectGameMode : public AGameMode
{
GENERATED_BODY()
public:
AMyProjectGameMode(const FObjectInitializer& ObjectInitializer);
};
UCLASS(minimalapi),这段就是上面说的宏,用于包裹类,括号里面的minimalapi是一个关键字声明,作用是使这个类只暴露指定函数给其它模块, 减少编译时间。
这些关键字声明都可以在http://blog.youkuaiyun.com/xoyojank/article/details/43814839这篇博客找到,往后翻还有其他宏的关键字介绍。
然后是class AMyProjectGameMode : public AGameMode,这段的意思很明确,就是说明这个类继承自AgameMode类,前缀A表示继承自AActor。
GENERATED_BODY(),这是一个生成构造函数的宏,还有一些其他的定义,需要在类的最前方声明,与之相似的还有GENERATED_UCLASS_BODY(),只不过前者定义了构造函数,后者声明了却没有定义。
AMyProjectGameMode(const FObjectInitializer& ObjectInitializer);由于需要定义自己的构造函数,所以这里并没有使用GENERATED_BODY()定义的默认构造函数,而是重新声明了一个。
MyProjectGameMode.cpp
#include "MyProject.h"
#include "MyProjectGameMode.h"
#include "MyProjectCharacter.h"
AMyProjectGameMode::AMyProjectGameMode(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// set default pawn class to our Blueprinted character
static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/ThirdPersonCharacter"));
if (PlayerPawnBPClass.Class != NULL)
{
DefaultPawnClass = PlayerPawnBPClass.Class;
}
}
AMyProjectGameMode::AMyProjectGameMode(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
这一段我也不甚理解,我猜测ObjectInitializer引用传递是这个类的父类引用,Super是一个变量&#