一、工程概述
工程构成:Engine、Games、Visualizers,分别是引擎源码、游戏模块、描述符。
Games路径下包括了引擎和工程的基础配置文件Config 和 工程代码Source两部分。
UCLASS用于标记类对象属于UObject的子类。UObject的整体继承关系如下图所示:
pladmin·2024-10-03·172 次阅读
工程构成:Engine、Games、Visualizers,分别是引擎源码、游戏模块、描述符。
Games路径下包括了引擎和工程的基础配置文件Config 和 工程代码Source两部分。
UCLASS用于标记类对象属于UObject的子类。UObject的整体继承关系如下图所示:
UObject的构造应该只包括成员赋值,不要夹杂其他的函数调用;UObject应该仅在运行时由NewObject或CreateDefaultSubobject创建,而不能手动去new它,这样UE可以自动进行内存管理。同理,不支持智能指针。
函数头的宏 工程名称_API用于和UObject兼容;函数体内的GENERATED_BODY()会对类进行设置,以便支持引擎要求的基础结构,像UCLASS和USTRUCT都要求有GENERATED_BODY()。
关于Build模块,里面包含了本项目所需要的所有模块。
关于Pawn,类拥有一些基本的方法,例如GENERATED_BODY()生成引擎支持,构造函数+析构函数,BeginPlay初创调用,Tick帧调用,SetupPlayerInputComponent绑定用户输入。
Pawn中定义碰撞组件:
UPROPERTY标识了声明可以被UE主动控制和垃圾回收的变量。EditAnywhere就是声明该变量在面板中处处可编辑,而Visible是仅可见不可改;BlueprintReadWrite就是蓝图中允许读写;Category就是对变量进行分类存放。
上面只是声明了一个组件指针,现在要对组件创建实例。创建完实例后,就可以对组件的属性进行赋值了:
同理,2D动画组件的声明和创建实例:
这里的FlipbookComponent相当于是一个2D动画播放器,而Flipbook是一个动画本身。Flipbook由一段序列帧和动画属性构成,而FlipbookComponent负责循环播放这一段动画。
增加相机同理,要注意相机一般和相机臂一起定义:
对于相机臂的组件定义和基础参数设置:
而相机直接挂载在相机臂一端即可:
Cpp写好的一般都是父类,即定义了一类物体对象拥有哪些组件和属性,而真正在ue使用的时候 需要派生一个蓝图子类,然后在蓝图中进行组件和属性的信息编辑。
接下来是增强输入组件(玩家控制器)。首先需要一个总控制器UInpuyMappingContext,然后定义几个类型的输入UInputAction:
因为UE默认使用的是自带的控制器系统,现在我们要将自己定义的新控制系统IMC绑定上去,所以要再BeginPlay函数中进行绑定:
将输入和对应回调函数进行绑定,使用BindAction进行绑定,第一个参数为输入,第二个参数为按键状态,第三个参数为回调函数。
具体的回调函数内容就不记录了,太琐碎了。
感觉和Pawn基本没啥区别,重点是Pawn如何主动创建Actor实例:
然后编写创建实例的逻辑,用到的函数是GetWorld()->SpawnActor,即使用世界类的创建Actor的函数:
计时器的定义方法,和win32的Timer类似,首先需要定义一个计时器句柄:
计时器自己并不会计时,需要世界World使用SetTimer(计时器句柄,所有类,回调函数,时间)来主动对他计时,调用方法如下:
碰撞盒具备一个动力学回调,用来进行碰撞检测:
回调函数必须要提前声明UFUNCTION(这样才能应用引擎的反射系统):
碰撞检测的回调函数的具体写法:
创建抽象类,其纯虚函数就是接口,所有继承该抽象类的子类必须重写其纯虚函数。
这里的设计是这样的:当一个子弹打中人时,需要进行扣血。类似扣血的各种事件,其实应该由一个“战斗系统”来管理。战斗系统类就可以作为一个抽象类,将扣血事件作为纯虚函数:
然后让所有的我军和敌军都继承该“战斗系统”基类,并分别override这个扣血事件函数。最后,在上一节的子弹碰撞事件中,去调用我军和敌军的扣血函数:
假如我们需要在蓝图中定义受击反馈逻辑,那么就需要在类中定义一个受击反馈函数,并标记UFUNCTION,这样在蓝图中就可以使用该节点。
有了受击反馈逻辑函数,我们就可以在里面编写后退的效果了。但是为了提高代码的复用性,我们希望自定义一个后退组件:
在该组件中定义后退函数,然后在角色的蓝图中添加该组件,并调用该组件中的后退函数。
Comments | NOTHING