首页 > 代码库 > Unreal4(虚幻4抽茧剥丝)——03章从生成代码入手

Unreal4(虚幻4抽茧剥丝)——03章从生成代码入手

本章开始我们进入Unreal4正统的学习阶段

首先我们打开Unreal系统工程

运行Unreal4,新建工程

选择TP_FirstPerson C++版本(笔者的向导提示FirstPerson已经存在,因为工程已经预先创建了,请读者忽略),点击创建项目,工程向导将为您自动创建一个第一人称射击游戏的架子。并询问是否打开C++工程,在这里我们选是即可

工程打开后如图所示,并且对UnrealEngine的源代码工程进行了关联。

Engine目录关联到了所下载的引擎源代码,至于Programs中的一些项目容后用到时再细说,这里打开FirstPerson这个项目目录,这里就是我们向导模板为我们生成的工程所需的代码文件了

其中Character对应着游戏中的角色,是游戏物理表现的抽象,GameMode继承自Unreal的传统是Gameplay的抽象,Hud,是游戏中Hud显示的抽象,Projectile是游戏枪支发射体的抽象!

之所以我们要从这个工程讲起,是因为向导工程生成的代码中,只有这个工程相对丰富一些,具有一定的可讲性,当做入门的例子再好不过了。我们开始我们的抽茧剥丝,首先打开FirstPersonCharacter.h:

 首先这个类被各种各样的宏来装饰着,这个是UE4格式化C++实现反射的方式,大概作用是把相应一系列Metadata作为标记插入到二进制类中。在此如果展开讨论这些,很可能读者就会失去兴趣,我相信读者读这系列的目的就是为了尽快上手,能够快速做一些Unity里能做到的事,所以这些繁文细节容后讨论,该类是继承自Character,而Character继承自Pawn,Pawn作为Unreal系列的历史财富是对可控物体的一个很好的抽象并与普通Actor进行区别,而不像Unity所有可视物体都是Gameboject。

GENERATED_UCLASS_BODY()之后定义了该类的成员属性和方法,至于UPROPERTY,UFUNCTION这些宏的细节与本讲无关,本系列不是一个说明手册,而是抽茧剥丝一样,从一团乱麻中找出个线头,然后一点一滴一切自然明朗。所有读者不用心急了解这些。只需要跟着笔者的步骤就够了。.h文件暂时看到这里

我们打开FirstPersonCharacter.cpp文件

首先观察其构造函数

这个构造函数的const 参数PCIP很有意思也很重要:

他的作用是在真实的C++构造函数完成后用来初始化相应属性的一个内部类对象。

用过UE3的同学肯定记得Unreal Script中有个Properties块,用来初始化各个成员以及Component,进入UE4时代脚本被结构化C++以及BP的合作所替代,所以内部属性初始化直接采用了内部类对象PCIP进行设置

CapsuleComponent为从ACharacter继承的成员(这里提一句:根据Unreal的传统命名规则,所有直接或间接继承自Actor的类都以首字母A开头,所有直接继承自UObject类都以首字母U开头),所有此处只需要调用其初始化接口即可

FirstPersonCameraComponent 是UCameraComponent类型,此处是最简单最暴力的方法,直接通过PCIP创建并以CapsuleComponent为父,Attach到胶囊体上

Mesh1P是本类定义的成员,创建一个只有手和枪的Mesh并Attach到Camera上然后就继续进行一些初始化设置

这里有几个重点:

1 PCIP.CreateDefaultSubobject接口创建组件的方法

2 TSubobjectPtr<class XXX>的意义是通过内定智能指针创建相应类的对象由Unreal虚拟机统一管理并且进行自动GC

未完待续。。。。。。