上一次修改时间:2020-03-04 04:39:45

虚幻4初级教程上

  1. vs2017安装

    注:创建C++的项目时,Windows 8.1 SDK 和 UCRT SDK必须勾选;VR一体机上的游戏属于Android,因此最好将C++的移动开发也勾选上

    图片.png

    image.png

    image.png

  2. 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:代码文件;

  3. 编译类型

    每种编译配置包含两种关键字。第一种表明了引擎以及游戏项目的状态。第二个关键字表明正在编译的目标;

    图片.png

    图片.png

    组合的各种情况

    图片.png

  4. 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在工作的时候需要你提供正确的前缀,所以虽然说是约定,但你也得必须遵守;

  5. 基础概念

    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也支持各种插件;

  6. 编译系统

    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.

  7. 手柄的位置即为玩家出生的位置

    图片.png

  8. 蓝图

    图片.png

    创建具有初学者内容的蓝图项目后,蓝图的查看位置;

    图片.png

    1)蓝图里,红色的为输出响应;

  9. 输出响应的自定义

    图片.png

    图片.png

    jump对应的蓝图及其响应

    图片.png

    图片.png

    自定义键位

    图片.png

    移动角色时,控制角色转向的值

    图片.png

  10. 蓝图中常用的变量

    1)print,用于打印信息,打印函数里可以控制打印信息,如打印到屏幕上,日志文件中,打印到屏幕上的字体的颜色,打印信息显示的持续时间等;

    图片.png

    图片.png

    2)event BeginPlay,初始化整个场景(一个游戏world)时,会调用整个场景里所有的actor,然后从actor里调用beginPlay;场景中必须存在实例,如果场景里没有实例时,初始化后会找不到actor,因此也不会调用BeginPlay;

    图片.png

  11. 新建蓝图的生效

    新创建的蓝图,需要在蓝图界面上点击编译后,再点击保存,就可以在ue4主界面点播放看到效果;

    图片.png

  12. 蓝图里变量函数的创建

    图片.png

    蓝图中创建好的变量可以直接用鼠标拖拽到流程中;

    图片.png

    将打印函数的值拖拽到刚创建好的变量中后,就可以将该变量的值打印到屏幕上;

    图片.png

    将boole类型的变量的初始值设置为true,新增一个分支branch;

    图片.png

    变量的默认值,boole类型的变量将默认值打勾后为True,否则为False

    图片.png

    蓝图中的变量类型中,name型变量是自带索引的,字符串和文本是不带索引的,name是不区分大小写的,text会区分;

    图片.png

  13. UE4界面字体大小调节

    图片.png

  14. 蓝图下数组创建及数组的基本操作

    图片.png

    图片.png

  15. TArray、TSet、TMap的区别

    1)TArray里面的值可以重复,TSet里不能;

    2)TSet可以进行交并集的运算,可以转换成数组;

    3)运行速度:TMap最快,其次是TSet,相对来说,TArray最慢;

    4)TMap,TSet内部的实现都是二叉树,因此都没法进行Get操作;

    5)TMap可以通过find方法来用key寻找value,TSet则不行;

  16. 蓝图中的流程控制

    1)蓝图中branch为代码中的if;

    2)蓝图中branch的默认值为True;

    图片.png

    3)ForLoop相当于代码中的for循环,ForLoopWithBreack相当于带break的for循环,WhileLoop相当于While循环;

  17. 蓝图中的结构体

    1)创建结构体

    图片.png

    图片.png

    2)双击创建好的结构体并进行设置结构体的构成;

    图片.png

    3)在蓝图中使用刚建好的结构体;

    图片.png

    图片.png

    4)直接将变量更改为建好的结构体;

    图片.png

    注:结构体在UE4中都是以F开头来命名变量名,枚举类型类似于结构体,枚举类型一般配合流程控制里的switch来使用,UE4中的枚举以E开头来命名变量名,VC中,定义好枚举类型的变量

  18. 蓝图界面下的控制版里可以看到UE4里已经定义好的所有库文件

    图片.png

    图片.png

    蓝图里的流程控制相关的库文件:

    图片.png

    图片.png

    1)Delay相当于代码里的sleep;

    2)DO N和DoOnce分别表示执行N次和执行一次;

    3)FlipFlop会交替执行,非常合适用来做有打开和关闭功能的按钮,下图流程里会交替打印ABABAB;

    图片.png

    4)Gate流程里,当Gate处于open时,会执行Exit,默认是close;下图中,按下键盘上的数字1键时,会开始打印pikaqiu,按下2后则停止打印;

    图片.png

    5)Retruggerable Delay与Delay类似,但Retruggerable Delay在event Tick里,会一直刷新延时的时间,导致completed永远不会被执行,Delay不会被event Tick刷新;

    图片.png

    如下图,Retruggerable Delay里将延时设置为1秒时,如果在按下1数字1键的速度小于1s,则completed不会被执行,但松开按键时,会被执行一次;按键速度大于1秒时,则会按几次就执行几次;

    图片.png

    6)序列可以用来依次执行多个事件;

    图片.png

  19. 蓝图里的函数及事件

    蓝图里的构建函数相当于对已有库函数的二次封装,自定义事件类似于自定义函数;

    图片.png

    图片.png

    函数里可设置断点用于调试流程;

    图片.png

  20. 游戏场景中游戏模式的设置

    图片.png

    图片.png

    项目设置里可以设置全局的游戏模式

    图片.png

    图片.png

    上图设置的游戏实例也是全局的,不会随着关卡的切换而消失;

  21. 自定义宏里可设置多个形参,输出也可以设置多个

    图片.png

    图片.png

  22. Actor事件接口

    注:下图中的事件应放到关卡蓝图里

    图片.png

    图片.png

    新建一个Actor

    图片.png

    图片.png

    Actor提供的事件

    图片.png

    在一个Actor中,覆盖函数不能重复,总共有18个,将这18个全部后所有事件的列表:

    图片.png

    Actor周期类

    1)EventTick:每帧都会调用的事件

    2)EventBeginPlay:游戏开始时会初始化,多个Actor在同一个场景中时,会同时初始多个EventBeginPlay

    3)EventDestroyed:析构函数,当Actor被销毁时触发,销毁Actor的函数为

    图片.png

    4)EventEndPlay:类似EventDestroyed,Actor被销毁时触发,该事件根据Actor的销毁方式不同而触发不同的分支,用switch可以看到提供的枚举类型,分别为调用Destroy函数销毁,关卡切换销毁,UE4编辑器结束时销毁,Actor被从场景中移除后销毁,退出游戏时销毁;

    图片.png

    图片.png

    Actor交互类:

    新创建一个球,再在球上添加一个Box;将Box移到根目录并缩放;取消Box的隐藏,再将其放入场景中

    图片.png

    图片.png

    图片.png

    图片.png

    图片.png

    图片.png

    将场景里的鼠标释放出来,用来点击刚创建的方框

    图片.png

    1)EventActorOnClicked:Actor被点击时触发;

    2)EventActorOnReleased:Actor被点击后,点击释放时触发;

    将Box的碰撞预设值改为overlapAllDynamic,然后关掉模拟物理

    图片.png

    3)EventActorBeginOverlap和EventActorEndOverla:碰撞预设值改为overlapAllDynamic后,当Box和人物重叠时会触发EventActorBeginOverlap,重叠离开后会触发EventActorEndOverla;

    图片.png

    BeginPlay里再增加一个Enable Mouse Over Events事件

    图片.png

    4)EventActorBeginCursorOver和EventActorEndCursorOver:当鼠标和Actor重叠时,触发EventActorBeginCursorOver,离开时触发EventActorEndCursorOver;

    图片.png

    伤害:

    1)EventHit:Actor被碰撞时触发,从事件的枚举值里,可以知道碰撞的方式;

    图片.png

    开启模拟物理后,Actor被碰撞后会产生移动;

    图片.png

    2)EventRadialDamage:半径伤害,该伤害有衰减,越往中心,伤害超高,越往外围,伤害越低;

    图片.png

    3)EventPointDamage:点伤害

    图片.png

    打开关卡蓝图

    图片.png

    在关卡蓝图里创建Acotr1(已将Acotr1重命名为pikaqiu)的引用

    图片.png

    在关卡蓝图中创建伤害,并将伤害来源设置为关卡本身self

    注:下图中设置鼠标的Show Mouse Cursor需要选建Get Player Controller再从Get Player Controller的返回值里打找

    图片.png

    在关卡开始的时候,就可以检测到Acotr1收到了关卡本身的伤害

    图片.png

    切换视角

    点击播放后,按~进入控制台,将Actor1重命名为pikaqiu,再在控制台里利用viewAcotr pikaqiu命令切换到Actor1的视角

    图片.png

    图片.png

    图片.png

    图片.png

    1)EventOnBecomeViewTarget和EeventOnEndViewTarget:在视角切换到Actor1上时会触发Actor1里的EventOnBecomeViewTarget事件,当视角离开Actor1时,会触发Actor1上的EeventOnEndViewTarget事件;

    Comment

    图片.png

    1)当初始化关卡时,会触发该事件,读取关卡时,不会触发该事件;

  23. 自定义事件

    自定义一个按键盘上1键,输出aaa的事件

    图片.png

    图片.png

    图片.png

  24. 角色的事件

    图片.png

    图片.png

    图片.png

    1)Event On Jumped事件上增加一个Launch Character,可以定义跳跃时角色的位移,如下图,角色跳跃时,将增加向上1000的高度,且可以重复增加

    图片.png

  25. gamemode函数

    图片.png

    图片.png

    1)EventOnPostLogin:多人游戏时,gamemode只有一个,创建gamemode的为主机,其它玩家会通过长链接加入到该gamemode里,有玩家加入时会触发EventOnPostLogin;

    图片.png

  26. 用户界面创建

    1)创建一个控件蓝图,重命名后打开,并在其中放入按钮

    图片.png

    图片.png

    图片.png

    2)打开关卡蓝图,并在eventBeginPlay后面关联上面创建好的UI界面,再连接到视角就能在主视角中看见按钮

    图片.png

    图片.png

    图片.png

    图片.png

    UI界面里可重写的函数:

    图片.png

    图片.png

    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

    图片.png

    2)On Preview Mouse Button Down:界面上的button,text,image等控件被点击时都会触发该事件

    图片.png

    图片.png

    2)On Preview Key Down:类似上面的On Preview Mouse Button Down,但On Preview Key Down只有可交互的控件能激活,比如按钮控件,不可交互的,如image等则不能激活

    3)On Paint:可以绘制图形,比如在鼠标下面绘制一个图形或一段文字

    图片.png

    4)On Mouse Button Down和On Mouse Button Double Click:鼠标单击和双击控件时触发

    图片.png

    图片.png