学习课程:Unreal Engine 5 – Full Course for Beginners
非教程,仅学习记录及碎碎念,学完感觉UE就非常的像预制菜,简简单单就能有非常好的效果(非常に新鲜で、非常に美味しい!),但装料太足了要想拆分明白用料和流程又会比较复杂!
Creating Levels
创建基本关卡,几个组件一拖就能有比较好的效果了。skylight在只用这几个组件的时候好像没有什么效果,往后看看。
LandScapes
很容易上手的地形绘制功能,包括很多的基础功能。大概类似Unity Terrain的功能。
BluePrint
讷,其他引擎做的到吗?虽然个人更喜欢用代码来书写逻辑,但这个BluePrint确实在一些情况下比写代码方便(参考手写Shader和Shader Graph)。
LeveL Blueprint有两个起始结点,Event BeginPlay在场景开始运行时(第一帧)执行一次(Unity的monobehaviour类的Start()函数),Event Tick则是每帧执行一次(类比update()函数)。
对于函数,默认是每次需要调用都会获取新值,而不是用第一次调用得到的值。例如下例中,两次输出的位置是不同的。
蓝图中的变量,结构体,枚举,函数
没什么可以介绍的,都是C++相同的东西。
Macros
翻译过来是宏,有一些比较特殊的特性,比如能多输入多输出,能用Delay等等。但目前还不是很清楚具体使用场景。
Delay
:比较特殊的函数,主线程不会因为 Delay 停止运行。
Delay 的实际执行过程如下:
1.当前帧运行到 Delay 时,定时器被注册。
2.主线程立即返回,继续处理其他任务(例如下一帧的 Tick)。
3.在 x.xx 秒后,定时器触发并执行 After Delay。
也就是说,在Tick中使用Delay不会影响帧率,但是会产生多个定时器。
Flip Flop
字面意思,两个分支每执行其中一个下次就执行另一个。
Do Once
只执行一次,但触发Reset后,再进入该事件依然可以执行。
classes/Actor
蓝图创建基本类就类似Unity中创建一个C#脚本书写类,创建Actor父类的类,就类似于创建了一个自带Object的C#脚本。
Actor可类比Object,Component倒是都一样叫法;
Actor的Tick可开可关,而且可以很方便的设置Tick的间隔。
在设置Static Mesh的时候发现,UE的Static Mesh是自带很复杂的碰撞体的,而且设置的Actor和LandScape创建的地面发生碰撞是不会触发Event ActorBeginOverlap的,可能默认设置两者的碰撞体不会触发Event ActorBeginOverlap。这块和Unity有很大的不一样,Unity中Mesh,Collision和Rigidbody完全是分开的组件。
Pawn:指代玩家控制的Actor。
Character/角色控制
根据介绍,Character就是可以四处走动的一种Pawn,创建一个Character(或者说创建一个继承自Character类的子类)通常自带4个组件,碰撞,朝向,Mesh和角色移动。
但如果想“操控”该Character,还需要设置一下GameMode,创建一个GameMode,然后将DefaultPawnClass设置为我们创建的Character,这时候启动游戏会使用设置的DefaultPawnClass创建一个Character,对于GameMode中没有声明的部分,都会创建默认的设置(比如相机,起始位置等,例如默认GameMode会创建了一个默认的Pawn给玩家控制)。
GameMode 定义游戏的规则。规则可以包括玩家加入游戏的方式、游戏暂停和关卡过渡以及任何游戏特定的行为,如获胜条件。每个关卡都设置了 GameMode,而且 GameMode 可在多个关卡中重复使用。
使用Add Movement Input控制移动
Add Movement Input只能在每帧运行的事件中生效(如Tick Events,InputAxis等),所以不能直接用Keyboard Events触发Add Movement Input,因为Keyboard Events只在事件发生的瞬间触发一次,而且不是基于帧渲染的频率(可以理解为不是在每一帧内检测是否按下的)。而且,用InputAxis Mapping支持修改键盘映射,Keyboard Events就直接固定了。
鼠标控制视角
同理,但默认视角控制只能控制Yaw。相机如果启用Use Pawn Control Rotation,对角色被冻结的轴相机可以旋转(在自身坐标系下),对角色也能旋转的轴则只旋转角色(角色带动相机旋转,在整个Character坐标系下)。
设置全局灵敏度
玩家在角色中设置的灵敏度在每次重新创建角色时都会变成默认值,所以需要一个全局的灵敏度,这样每次创建角色都能使用设置好的灵敏度,大概这种场景。
教程中通过在PlayerControl中创建一个变量,然后每次创建Character都读取这个变量来设置灵敏度实现。感觉用PlayerControl只是因为PlayerControl在会关卡开始且在Character的BeginPlay Event之前创建,这样能读到一个有效且整个关卡运行时都存在的值,那么放在GameMode中也是可以的,但是从功能上说,PlayerControl更合适。
想要在m_Character中使用m_PlayerControl的方法,需要Get父类PlayerControl再Cast to m_PlayerControl获取到m_PlayerControl,基本上所有自定义的子类都是这么获取的。
设置跳跃
然后想擅自实现一下跳跃,托了一个Jump到蓝图上,于是乎就完成了最基础的跳跃。嗯?我在期待什么,我地面检测呢,我控制逻辑呢。Character Movement说,我全帮你做好了,想跳的更高?想二段跳?都轻松拿下。
实现拾取功能
教程中的拾取功能拾取的是overlap的Actor中下标为0的Actor,简单添加了一下功能,实现在overlap多个Actor时,会拾取距离最近的Actor。
变量的可设置项
Expose On Spawn:暴露给Spawn,可以在蓝图中Spawn Actor时设置该变量。
instance editable:实例可编辑,在编辑器中可以直接编辑该变量。
实现推球功能
这里就不实现了,没有新的内容这块,推球是通过AddImpulse实现的,AddImpulse会给物体某个方向的力。通过开启组件的Actor Hidden In Game可以在游戏中显示该组件(比如碰撞体)。
Impulse vs Force
AddImpulse will apply the force vector without adjusting for frames per second (fps). AddForce adjusts the force vector according to the current fps as it is intended to be called every frame. For example, if your frame rate were 60 fps and you called AddForce once then you would have to multiply the force vector by 60 (or call AddForce 60 times) in order to get the equivalent effect as calling AddImpulse once.
描边
最简单的方法实现,正面剔除沿法线外扩渲染一次,正常渲染一次。没实现固定描边粗细,要实现的话在CS中计算外扩的距离即可。
UE好像没找到怎么直接给mesh增加材质的办法,应用多个材质的方法是增加多个子mesh,用不同的材质(?),或者用Modeling模式,但这个只能对内置的基础mesh修改材质数量。
Blend Mode:
详见:材质混合模式
这种描边对每个面片都是独立顶点的mesh会比较差,对简单的几何体的话,可以直接用个放大一些的mesh简单处理。
RayTrace
这块也是介绍了下Line Trace怎么使用的,以及多相机如何选择当前使用的相机,用于Debug的图形的绘制。教程用的是Line Trace by Channel,这里Channel类似于tag,可以在碰撞体中选择如何处理各Channel的射线检测(忽略或者击中)。
创建UI
实现血条及血条控制,主菜单和关卡切换功能。
基本控制流程很容易理解。主要是熟悉各种组件的使用,设置鼠标是否可见,三种Input Mode的效果(Game only:鼠标限制在游戏窗口,且不能控制UI。UI only:只能控制UI,鼠标不会被游戏窗口限制。Game and UI:都可以控制,且鼠标不会被游戏窗口限制)。
创建蓝图函数库 blueprint function library
大概就是个自定义函数库,可以将一些需要使用到的,但与物体无关的功能性函数写在这。
静态网格/Nanite/材质
动画系统
Animation Blueprint可以看成是一个包含状态机及状态机条件控制的蓝图。针对骨骼网格,Animation Blueprint可以自动做到比较丝滑的在不同状态之间切换。
Blend Space:功能是通过参数混合多个动画。比如可以通过速度控制 站立 和 行走状态的混合动画。实现速度越快,人物行走动作越快。但由于键盘做不到轻推w,使用 Blend Space 的效果并不是很显著,所以添加了一个Shift跑步的功能。
站立到行走的状态切换虽然看着和Blend Space差不多,都实现了站立到行走的丝滑过渡,实际是发生在两个阶段的,一个在状态间,一个在状态内。
至此蓝图部分全部实现。