腾讯UE4公开课笔记

想法

了解了解工业界的角度的UE4,腾讯的客户端公开课,可以学习学习

第一节课

简单介绍了下这课是干啥的,腾讯一共4个工作室,每个工作室开一个班,我被分到的班是北极光开的,有将近80人。

总共10节课,最后一节课大作业考核,想拿实习offer得保证出勤率、大作业考核质量以及一个面试

据HR的意思,这课的ppt是保密的材料,手机截不了图,电脑客户端也是水印满满,但是说了可以记笔记。

第一节课技术方面主要是讲了讲UE4的蓝图,展示了一下基本的组件操作之类的,蓝图我之前用过,所以没有仔细听。

讲师的ppt做的比较简单,讲的具体内容也感觉没有刻意准备,但是对一个同学提出的问题能快速清晰的在项目中演示解决,感觉不是专门的讲师,像干活的大佬里拎一个出来的。

课后没有作业,这点我比较失望,本来想借机会体验一下工业级开发是怎样的。

第二节课 游戏模式

gamemode gamestate player pawn

loadmap时 先初始化gamemode 再初始化gamestate

中间一些细节忘记记录了,有点可惜,主要是从C++的层面讲述 UE4 如何运行,如何继承关系之类的。

我读过的一本罗丁力的《大象无形:虚幻引擎程序设计浅析》中也讲到了一些,可以参考一下。

可运行文件 + 说明文档

第三节课 UE4代码规范 & 3d Math

代码规范:1、降低复杂度 2、提升可维护性 3、提升可读性

UE4 C++代码规范

命名

  • 清晰、明确、避免过度缩写

  • 变量名:大驼峰式(CamelCase),bool类型须加b前缀
    如: TotalLeaves = SmallLeaves + LargeLeaves - SmallAndLargeLeaves;

  • 类型名:前缀 + 大驼峰式

    开头字母 表示含义 示例
    T 模板类 TMap
    U 继承自UObject UMoviePlayerSettings
    A 继承自AActor APlayerCameraManager
    S 继承自SWidget SCompoundWidget
    I 抽象接口类 INavNodeInterface
    E 枚举 EAccountType
    b 布尔变量 bHasFadedIn
    F 其他类 FVector
  • 引用传入可能修改的函数变量:加Out前缀

数据类型

  • 基础类型

    数据类型 意义 大小(字节)
    bool 布尔值 sizeof(bool)
    TCHAR 字符 sizeof(TCHAR)
    int8/uint8 有符号/无符号字节 1
    int16/uint16 …短整数 2
    int32/uint32 …整数 4
    int64/uint64 …整数 8
    float 单精度浮点数 4
    double 双精度浮点数 8
    PTRINT 与指针同样大小的整数 sizeof(PTRINT)
  • 字符串类:使用UE定义的FString/FText/FName/TCHAR等

  • 容器类:应避免使用stl,使用UE定义的TArray/TMap等

代码风格

  • 大括号换行

  • if-else对齐

  • 使用Tab缩进

  • switch-case语句中,必须要有default,如果fall-through,必须明确注释

命名空间

  • UnrealHeaderTool仅支持全局命名空间的类型

  • 不要在全局命名空间中使用using声明

  • 一些宏在命名空间内可能会失效,可以尝试UE_前缀的版本

C++11

  • 不要使用NULL宏,使用nullptr来表示空指针

  • Lambda函数须明确指出返回类型

    1
    2
    3
    4
    auto AddFunc = [](int A, int B) -> int
    {
    return A + B;
    };
  • 不要使用 auto,除了 lambda函数、迭代器声明、模板中类型推导

etc

详见:https://docs.unrealengine.com/4.26/en-US/ProductionPipelines/DevelopmentSetup/CodingStandard/

后面还讲了一些3d math之类的东西,图形学里也有,懒得记录了

推荐了本书《游戏引擎架构》,图书馆正好有,最近在看

第四节课 虚幻四UI系统(UMG)

简要介绍了下 界面

基础知识

可见性 Visibility

  • Visible 显示可见并可以接受点击
  • Collapsed 不显示且折叠起来,不接受点击
  • Hidden 不显示,占据位置,不接受点击
  • Not Hit-Testable(Self & All Children) 显示,自己和子控件不接受点击事件
  • Not Hit-Testable(Self Only) 显示,只自己不接受点击事件

控件Widget

插槽Slot

子控件与父控件的相对位置

介绍了些xx属性是干嘛的

锚点:Anchors

常用控件

  • Button
  • CheckBox
  • Image
  • ProgressBar
  • Text <-> RichText
  • EditableText (Multi-Line)

容器(Panel)

  • CanvasPanel
  • HorizontalBox
  • VerticalBox
  • Overlay
  • WidgetSwitch

复杂控件

  • UniformGridPanel
  • GridPanel
  • ScrollBox
  • ListView
  • InvalidationBox

控件的更新方式

1.功能/函数绑定
绑定一个函数更新UI,逐帧处理

2.属性绑定
绑定到UI控件的属性,也是逐帧tick,略优于函数绑定

3.* 事件驱动更新
不需要tick,只有事件发生时才会调用,相比消耗极小

UMG 与 Slate

Slate

虚幻中真正的UI框架
包含输入处理、事件分发、渲染等核心内容

UMG是对Slate的封装,方便蓝图界面编辑以及虚幻的垃圾回收机制

SWidget剖析

SWidget是Slate层控件UI的基类
关键函数

  • ComputeDesiredSize()
  • ArrangeChildren()
  • OnPaint()
  • Event handlers (onclick()…)

性能&优化

UMG渲染结构

  • UserWidget 对应一个用户界面

第五节课 物理

几何体

  • Sphere
  • Capsules (常用表示角色)
  • Boxes
  • Planes
  • Convex Meshes (实心)(凸包多边形)
  • Triangle Meshes (空心多边形)
  • Height Fields

包围盒

  • Sphere
  • AABB (三个轴与坐标轴平行的最小六面体)
  • OBB (不限轴向的AABB)
  • DOP (离散有向多面体)
  • Convex Hull

相交测试

碰撞查询

用来检测假想中的碰撞

  • 射线扫射 (ray cast)
  • 扫掠 (sweep)
  • 重叠 (overlap)

空间划分(性能优化)

UE4中物理

碰撞响应属性

https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/Tracing/Overview/

碰撞查询

RayCast(射线投射) LineTraceXXX
Sweep(扫掠) 形状名TraceXXX
Overlap(重叠) 形状名OverlapXXX

物理材质

定义了物体的一些物理属性,也可以指定表面类型(物理贴花)
实现定义摩擦力、恢复力、密度。
表面类型:用来表现物理交互(如被子弹击中)的效果。

物理动画

基于动画及物理模拟的插值动画,(实现人物受伤之类的效果)

碰撞查询Filter

Filter可以控制碰撞查询中有哪些shape不需要包含进结果中
FilterFlag:PxQueryFlag::eSTATIC, PxQueryFlag::eDYNAMIC
查询的三个阶段 (有利于优化性能)
Broad Phase
<–Pre filter
Middle Phase
Narrow Phase
<–Post filter

第六节课 动画

ue4中主要讲的就是骨骼动画,
主要是分为骨骼和蒙皮

SkeletalMesh 负责网格体蒙皮,渲染
PhysicsAsset 负责处理碰撞、布娃娃等系统
Skeleton 定义了骨骼的层级结构

UE动画蓝图

Event Graph 添加动画相关的逻辑

Anim Graph 管理动画的pose,一般用作动作叠加,动作融合之类的

Animation Sequence
关键帧构成的动画序列,最基本的动画类型

Local Space:有关父节点的偏移
Mesh Space:有关Root的偏移

BlendSpace 提供了动画的融合功能,通过传入参数动态计算各个动画权重输入融合后的结果。
常见的有人物走路动画

AimOffset是BlendSpace的一个子集,它是在MeshSpace下具有叠加属性的BlendSpace,专门用作武器瞄准的动画类型

Montage是一种在编辑器中创建的动画资源,可以由若干的AnimSequence组成(可以自由衔接或跳转),设置Section和Slot,可以实现一些特殊的动画控制(动画智能循环、基于逻辑的动画切换)
(可以实现冲刺或者单发武器)
注意Montage中的RootMotion,可以实现root随着动画而位移(防止后面位置错乱衔接不上)

常用动画节点

混合节点(Blend Nodes)
ApplyAdditive:在LocalSpace下叠加动画
ApplyMeshSpaceAdditive:在MeshSpace下叠加
Blend:把两个Pose混合
BlendBoneByChannel:指定一根骨骼和另一根融合
BlendMulti:同时混合多个Pose

状态机:提供了图形化的方式来控制动画的切换(状态之间可以设置转换条件以及转换的融合相关数据)

IK (Inverse Kinematics) 逆向运动学
Two Bone IK 限制3个骨骼,一般用于人物的四肢
FABRIK (Forward and Backward Reaching Inverse Kinematics)正向及反向的IK

资源获取

这里讲了一些Epic商城有付费或者免费的动画,但往往都并不是同一套骨骼,没法用,就只能主动用骨骼的重定向管理器,把对应骨骼绑定好再重定向动画。

第七节课 渲染基础

理论部分我就不做记录了,粗粗带过了点图形学的渲染部分。

UE4的材质系统

光源类型
定向光源,天空光照,点光源,聚光源

在材质编辑器中,通过可视化脚本编程,来创建HLSL代码
材质域、混合模式、着色模型(次表面、透明图层)

粒子系统

第八节课 网络同步

网络角色和授权

###Authority(授权)
拥有Actor的最终解释权

Autonomous Proxy(自主代理)
能够自主的指向一些逻辑,接受授权的Actor的矫正(玩家Pawn)

Simulated Proxy(模拟代理)
由授权的Actor完全控制(AI、其他玩家、场景中的可交互物品)

Net

NetDriver负责监听握手连接等,转给对应的NetConnection处理
Server的NetDriver维护一份NetConnection列表,每个NetConnection代表一个玩家
Client的NetDriver维护一个NetConnection对应连接的服务器

NetConnection不直接处理数据,把数据包转给对应的Channel处理

Channel分为ControlChannel(发送连接相关)、VoiceChannel、ActorChannel(负责每个需要复制的Actor)

同步方式

属性同步
定期检查需要同步的Actor,发生变更就更新
在UPROPERTY中使用Replicated,ReplicatedUsing表示属性需要被同步
用DOREPLIFETIME_CONDITION(ClassName, VarName, COND_XXX)来标识在何时需要同步(比如REPNOTIFY_Alway或REPNOTIFY_OnChanged)
属性同步不能保证先后顺序

RPC(远程过程调用)
只有执行时生效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// actor.cpp
if (GetLocalRole() == ROLE_Authority) // ROLE_AutonomousProxy, ROLE_SimulatedProxy
{
SetXXX();
}
else
{
ServerSetXXX();
}

bool ServerSetXXX_Validate()
{
return true;
}
void ServerSetXXX_Implementation()
{// 在服务器上调用了
SetXXX();
}
1
2
3
4
5
6
// actor.h
void SetXXX();

UFUNCTION(reliable, server, ...) // reliable, unreliable
// Server, Client, NetMulticast
void ServerSetXXX();

移动同步

第九节课 游戏AI

自动寻路

A*算法,结合了Dijkstra和贪心
基于评估函数寻找最优路径,效率高,较准确。

UE4使用Navigation Mesh计算地形,(体素化,生成区域,生成轮廓,生成多边形网格,生成高度细节)
用Recast寻路

行为树

行为树是由行为节点组成的树状结构,每个节点的执行会产生结果,传递给父节点,决定下一步的动作。
UE4中的行为树节点分为

  • 组合节点:控制节点,有一个或多个子节点
    顺序节点(Sequence):按顺序执行子节点,子节点出错立即停止运行,向上返回false。
    选择节点(Selector):按顺序执行子节点,一个子节点返回true就停止,向上返回true,子节点返回false,则尝试下一个子节点,全部子节点false才向上返回false。
    平行节点(Parallel Node):无条件遍历所有子节点。

  • 修饰节点:有且只有一个子节点,将结果处理(修饰)之后,传给父节点
    反相器(Invertor)、成功节点(Succeeder)、重复节点(Repeater)、重复直到失败(Repeater Until Fail)

  • 叶子节点:1条件节点,判断条件是否成立之后返回。2执行节点,执行成功返回True。

UE4 中有黑板,存储行为树必要信息的资产

评价

由于老师说讲课的ppt不能发给我们或者截图出来,所以本篇只限于一些文字记录。有些讲师讲的确实很不错,比方物理系统和网络同步那两节课,我觉得学到了不少。也有动画、AI这两节课我感觉没学到什么东西,作业都需要课后来找更多资料和教程。最后布置的作业也花了几天时间认真做了一下,虽说大部分是没什么意思的依葫芦画瓢,但是我觉得能从头到尾认真学完这门课也不错。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2022 d1gg12
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信