Skip to main content
VRCHINA
AR论坛
 首页 » 资源教程 » UE4教程

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

2016年09月03日 14:28:278330

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

首先我们打开Unreal系统工程

运行Unreal4,新建工程

Unreal4(虚幻4抽茧剥丝)——从生成代码入手 UE4教程 第1张

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

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

Unreal4(虚幻4抽茧剥丝)——从生成代码入手 UE4教程 第2张

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

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

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

Unreal4(虚幻4抽茧剥丝)——从生成代码入手 UE4教程 第3张

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

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

我们打开FirstPersonCharacter.cpp文件

首先观察其构造函数

Unreal4(虚幻4抽茧剥丝)——从生成代码入手 UE4教程 第4张

这个构造函数的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

Unreal4(虚幻4抽茧剥丝)——从生成代码入手 UE4教程 第5张

该函数是设置Unreal输入组件的,通过各种绑定接口将相应输入事件绑定到处理函数上Action是对应相应动作,Axis是轴绑定,这里我们发现Turn,TurnRate,LookUp,LookUpRate有2个版本

第一个是普通输入版本,另外一种支持Jopspad等力反馈设备。

Unreal4(虚幻4抽茧剥丝)——从生成代码入手 UE4教程 第6张

这个是bindAction对应的一个事件处理函数Fire也就是开枪

通过读取这个函数有助于我们掌握几个知识点

GetControlRotation();这是获得控制器,注意不是Actor或Pawn,或Character的Rotation

GetActorLocation() + SpawnRotation.RotateVector(GunOffset);这个是将GunOffset转换成世界坐标系的方法,基础得不能再基础了

World->SpawnActor<AFirstPersonProjectile>(ProjectileClass, SpawnLocation, SpawnRotation);这个十分重要演示了如何在UnrealWorld中创建一个Actor,好像Unity的Instance一样

UGameplayStatics::PlaySoundAtLocation(this, FireSound, GetActorLocation());这个是播放一个声音在一个点上,随即引出了一个重要的类接口UGameplayStatics,这个类接口很重要,十分重要,很多Gameplay静态方法都需要调用它来实现

UAnimInstance* AnimInstance = Mesh1P->GetAnimInstance();

        if(AnimInstance != NULL)

        {

            AnimInstance->Montage_Play(FireAnimation, 1.f);

        }

获得动画实例,并播放动画蒙太奇的方法,动画蒙太奇是Unreal4里的一个概念,它有很多用途,比如讲多个动画组合成一个动画接口,并在AnimBp中设置,根据输入事件切换对应插槽动画,动画的融合,动画循环等等控制以前这些只能用负责动画树的操作,今天完全可以再动画蒙太奇中进行制作了,大大简化了制作难度。动画蒙太奇,以及动画系统是UE4 Gameplay的重中之重,以后要分多个章节讲解,这里暂时提一嘴就够了。

更多教程关注微信公众号AR那些事【id:armeiti】

或者访问中国AR网(http://www.chinaar.com/)


评论列表暂无评论
发表评论