vs2017安装
注:创建C++的项目时,Windows 8.1 SDK 和 UCRT SDK必须勾选;VR一体机上的游戏属于Android,因此最好将C++的移动开发也勾选上;
UE4文件目录说明
Binaries:存放编译生成的结果二进制文件。该目录可以gitignore,反正每次都会生成。
Config:配置文件。
Content:平常最常用到,所有的资源和蓝图等都放在该目录里。
DerivedDataCache:“DDC”,存储着引擎针对平台特化后的资源版本。比如同一个图片,针对不同的平台有不同的适合格式,这个时候就可以在不动原始的uasset的基础上,比较轻易的再生成不同格式资源版本。gitignore。
Intermediate:中间文件(gitignore),存放着一些临时生成的文件。有:
1)Build的中间文件,.obj和预编译头等;
2)UHT预处理生成的.generated.h/.cpp文件;
3)VS.vcxproj项目文件,可通过.uproject文件生成编译生成的Shader文件;
4)ssetRegistryCache:Asset Registry系统的缓存文件,Asset Registry可以简单理解为一个索引了所有uasset资源头信息的注册表。CachedAssetRegistry.bin文件也是如此;
Saved:存储自动保存文件,其他配置文件,日志文件,引擎崩溃日志,硬件信息,烘培信息数据等。gitignore;
Source:代码文件;
编译类型
每种编译配置包含两种关键字。第一种表明了引擎以及游戏项目的状态。第二个关键字表明正在编译的目标;
组合的各种情况
UE4的命名约定
1)模版类以T作为前缀,比如TArray,TMap,TSet UObject派生类都以U前缀;
2)AActor派生类都以A前缀;
3)SWidget派生类都以S前缀;
4)抽象接口以I前缀;
5)枚举以E开头;
6)bool变量以b前缀,如bPendingDestruction;
7)其他的大部分以F开头,如FString,FName;
8)typedef的以原型名前缀为准,如typedef TArray FArrayOfMyTypes;
9)在编辑器里和C#里,类型名是去掉前缀过的;
10)UHT在工作的时候需要你提供正确的前缀,所以虽然说是约定,但你也得必须遵守;
基础概念
1)在UE4中,几乎所有的对象都继承于UObject(跟Java,C#一样),UObject为它们提供了基础的垃圾回收,反射,元数据,序列化等,相应的,就有各种"UClass"的派生们定义了属性和行为的数据;
2)UE4采用了组件式的架构;
3)在UE中,3D世界是由Actors构建起来的,而Actor又拥有各种Component,之后又有各种Controller可以控制Actor(Pawn)的行为;
4)在UE4中,你也可以为一个Actor添加一个蓝图或者C++ Component,然后实现它来直接组织逻辑;
5)UE4也支持各种插件;
编译系统
UE4支持众多平台,包括Windows,IOS,Android等,因此UE4为了方便你配置各个平台的参数和编译选项,简化编译流程,UE4实现了自己的一套编译系统,否则我们就得接受各个平台再单独配置一套项目之苦了。
这套工具的编译流程结果,简单来说,就是你在VS里的运行,背后会运行UE4的一些命令行工具来完成编译,其他最重要的两个组件:
1)UnrealBuildTool(UBT,C#):UE4的自定义工具,来编译UE4的逐个模块并处理依赖等。我们编写的Target.cs,Build.cs都是为这个工具服务的;
2)UnrealHeaderTool (UHT,C++):UE4的C++代码解析生成工具,我们在代码里写的那些宏UCLASS等和#include "*.generated.h"都为UHT提供了信息来生成相应的C++反射代码;
一般来说,UBT会先调用UHT会先负责解析一遍C++代码,生成相应其他代码。然后开始调用平台特定的编译工具(VisualStudio,LLVM)来编译各个模块。最后启动Editor或者是Game.
手柄的位置即为玩家出生的位置
蓝图
创建具有初学者内容的蓝图项目后,蓝图的查看位置;
1)蓝图里,红色的为输出响应;
输出响应的自定义
jump对应的蓝图及其响应
自定义键位
移动角色时,控制角色转向的值
蓝图中常用的变量
1)print,用于打印信息,打印函数里可以控制打印信息,如打印到屏幕上,日志文件中,打印到屏幕上的字体的颜色,打印信息显示的持续时间等;
2)event BeginPlay,初始化整个场景(一个游戏world)时,会调用整个场景里所有的actor,然后从actor里调用beginPlay;场景中必须存在实例,如果场景里没有实例时,初始化后会找不到actor,因此也不会调用BeginPlay;
新建蓝图的生效
新创建的蓝图,需要在蓝图界面上点击编译后,再点击保存,就可以在ue4主界面点播放看到效果;
蓝图里变量函数的创建
蓝图中创建好的变量可以直接用鼠标拖拽到流程中;
将打印函数的值拖拽到刚创建好的变量中后,就可以将该变量的值打印到屏幕上;
将boole类型的变量的初始值设置为true,新增一个分支branch;
变量的默认值,boole类型的变量将默认值打勾后为True,否则为False
蓝图中的变量类型中,name型变量是自带索引的,字符串和文本是不带索引的,name是不区分大小写的,text会区分;
UE4界面字体大小调节
蓝图下数组创建及数组的基本操作
TArray、TSet、TMap的区别
1)TArray里面的值可以重复,TSet里不能;
2)TSet可以进行交并集的运算,可以转换成数组;
3)运行速度:TMap最快,其次是TSet,相对来说,TArray最慢;
4)TMap,TSet内部的实现都是二叉树,因此都没法进行Get操作;
5)TMap可以通过find方法来用key寻找value,TSet则不行;
蓝图中的流程控制
1)蓝图中branch为代码中的if;
2)蓝图中branch的默认值为True;
3)ForLoop相当于代码中的for循环,ForLoopWithBreack相当于带break的for循环,WhileLoop相当于While循环;
蓝图中的结构体
1)创建结构体
2)双击创建好的结构体并进行设置结构体的构成;
3)在蓝图中使用刚建好的结构体;
4)直接将变量更改为建好的结构体;
注:结构体在UE4中都是以F开头来命名变量名,枚举类型类似于结构体,枚举类型一般配合流程控制里的switch来使用,UE4中的枚举以E开头来命名变量名,VC中,定义好枚举类型的变量;
蓝图界面下的控制版里可以看到UE4里已经定义好的所有库文件
蓝图里的流程控制相关的库文件:
1)Delay相当于代码里的sleep;
2)DO N和DoOnce分别表示执行N次和执行一次;
3)FlipFlop会交替执行,非常合适用来做有打开和关闭功能的按钮,下图流程里会交替打印ABABAB;
4)Gate流程里,当Gate处于open时,会执行Exit,默认是close;下图中,按下键盘上的数字1键时,会开始打印pikaqiu,按下2后则停止打印;
5)Retruggerable Delay与Delay类似,但Retruggerable Delay在event Tick里,会一直刷新延时的时间,导致completed永远不会被执行,Delay不会被event Tick刷新;
如下图,Retruggerable Delay里将延时设置为1秒时,如果在按下1数字1键的速度小于1s,则completed不会被执行,但松开按键时,会被执行一次;按键速度大于1秒时,则会按几次就执行几次;
6)序列可以用来依次执行多个事件;
蓝图里的函数及事件
蓝图里的构建函数相当于对已有库函数的二次封装,自定义事件类似于自定义函数;
函数里可设置断点用于调试流程;
游戏场景中游戏模式的设置
项目设置里可以设置全局的游戏模式
上图设置的游戏实例也是全局的,不会随着关卡的切换而消失;
自定义宏里可设置多个形参,输出也可以设置多个
Actor事件接口
注:下图中的事件应放到关卡蓝图里
新建一个Actor
Actor提供的事件
在一个Actor中,覆盖函数不能重复,总共有18个,将这18个全部后所有事件的列表:
Actor周期类:
1)EventTick:每帧都会调用的事件
2)EventBeginPlay:游戏开始时会初始化,多个Actor在同一个场景中时,会同时初始多个EventBeginPlay
3)EventDestroyed:析构函数,当Actor被销毁时触发,销毁Actor的函数为
4)EventEndPlay:类似EventDestroyed,Actor被销毁时触发,该事件根据Actor的销毁方式不同而触发不同的分支,用switch可以看到提供的枚举类型,分别为调用Destroy函数销毁,关卡切换销毁,UE4编辑器结束时销毁,Actor被从场景中移除后销毁,退出游戏时销毁;
Actor交互类:
新创建一个球,再在球上添加一个Box;将Box移到根目录并缩放;取消Box的隐藏,再将其放入场景中
将场景里的鼠标释放出来,用来点击刚创建的方框
1)EventActorOnClicked:Actor被点击时触发;
2)EventActorOnReleased:Actor被点击后,点击释放时触发;
将Box的碰撞预设值改为overlapAllDynamic,然后关掉模拟物理
3)EventActorBeginOverlap和EventActorEndOverla:碰撞预设值改为overlapAllDynamic后,当Box和人物重叠时会触发EventActorBeginOverlap,重叠离开后会触发EventActorEndOverla;
BeginPlay里再增加一个Enable Mouse Over Events事件
4)EventActorBeginCursorOver和EventActorEndCursorOver:当鼠标和Actor重叠时,触发EventActorBeginCursorOver,离开时触发EventActorEndCursorOver;
伤害:
1)EventHit:Actor被碰撞时触发,从事件的枚举值里,可以知道碰撞的方式;
开启模拟物理后,Actor被碰撞后会产生移动;
2)EventRadialDamage:半径伤害,该伤害有衰减,越往中心,伤害超高,越往外围,伤害越低;
3)EventPointDamage:点伤害
打开关卡蓝图:
在关卡蓝图里创建Acotr1(已将Acotr1重命名为pikaqiu)的引用
在关卡蓝图中创建伤害,并将伤害来源设置为关卡本身self
注:下图中设置鼠标的Show Mouse Cursor需要选建Get Player Controller再从Get Player Controller的返回值里打找
在关卡开始的时候,就可以检测到Acotr1收到了关卡本身的伤害
切换视角:
点击播放后,按~进入控制台,将Actor1重命名为pikaqiu,再在控制台里利用viewAcotr pikaqiu命令切换到Actor1的视角
1)EventOnBecomeViewTarget和EeventOnEndViewTarget:在视角切换到Actor1上时会触发Actor1里的EventOnBecomeViewTarget事件,当视角离开Actor1时,会触发Actor1上的EeventOnEndViewTarget事件;
Comment:
1)当初始化关卡时,会触发该事件,读取关卡时,不会触发该事件;
自定义事件
自定义一个按键盘上1键,输出aaa的事件
角色的事件
1)Event On Jumped事件上增加一个Launch Character,可以定义跳跃时角色的位移,如下图,角色跳跃时,将增加向上1000的高度,且可以重复增加
gamemode函数
1)EventOnPostLogin:多人游戏时,gamemode只有一个,创建gamemode的为主机,其它玩家会通过长链接加入到该gamemode里,有玩家加入时会触发EventOnPostLogin;
用户界面创建
1)创建一个控件蓝图,重命名后打开,并在其中放入按钮
2)打开关卡蓝图,并在eventBeginPlay后面关联上面创建好的UI界面,再连接到视角就能在主视角中看见按钮
UI界面里可重写的函数:
1)Event On Removed from Focus Path和Event On Added to Focus Path:某个按钮被激活时会触发Event On Added to Focus Path,该按钮的焦点被释放时会触发Event On Removed from Focus Path,如下图,当某一个按钮激活,获得焦点后,再点击其它两个按钮时,无法再次激Event On Added to Focus Path,需要先在空白处按鼠标右键释放焦点后,其它按钮点击时,才会触发Event On Added to Focus Path
2)On Preview Mouse Button Down:界面上的button,text,image等控件被点击时都会触发该事件
2)On Preview Key Down:类似上面的On Preview Mouse Button Down,但On Preview Key Down只有可交互的控件能激活,比如按钮控件,不可交互的,如image等则不能激活
3)On Paint:可以绘制图形,比如在鼠标下面绘制一个图形或一段文字
4)On Mouse Button Down和On Mouse Button Double Click:鼠标单击和双击控件时触发