UE 入门
本节课程内容
- UE学习途径和方法的介绍
- UE编辑器使用和编程技巧
- UE引擎工具了解
本节课程作业:
- 源码编译UE4/5(UE4.27.2/UE5.2.1),新建一个C++工程,进行简单场景编辑和工程设置
- 编译并构建安装包,确保能够用来将游戏工程安装到手机正常运行 (若无Android手机可构建桌面版本)
课程目标:
- 熟悉UE引擎的编辑器操作,了解UE引擎的游戏模式框架
- 能够独立获取和编译UE源码
- 能够在UE引擎中实现蓝图编程和C++编程
- 能够使用UE引擎构建Android平台游戏安装包
UE 特点
- 渲染品质 电影级别PBR渲染,先进的着色模型
- 美术制作 成熟的美术资产制作管线
- C++与蓝图 性能与可视化编程并重
- 开发周期 基于射击类的GamePlay框架
- 跨平台 移动、主机、PC、VR…
- 开源 有利于技术提升和定制化改造
UE/Unity/Open 3D/CryEngine/Source/DICE/Naughty/RAGE/AnvilNext2/IW Engine(id Tech 3)
Game engine are data-driven architectures that are reusable and therefore do not contain game content
游戏行为全部或部分由美术或者策划提供的数据控制
- 通用性与偏向性
- 可扩展性
- 完善工具链
游戏引擎:渲染
- Deferred Renderer编辑器、PC、Console默认渲染管线Feature levels “SM4”, “SM5”
- Forward+ Renderer用于桌面VR游戏,支持MSAA Feature Level “SM5”
- Mobile Renderer Forward Render, Deferred Render Feature levels“ES2”,”ES3_1”,“Vulkan”
移动端渲染模式
- Immediate Mode Rendering
- Tile Based Rendering
- Tile Based Deferred Rendering
游戏引擎:物理 Havok/PhysX/Bullet
物理引擎包含的内容:
- 碰撞检测
- 动态约束
- 刚体物理
- 车辆物理
- 布娃娃系统
Chaos in UE 实时电影视效级的大范围破坏
https://docs.unrealengine.com/5.2/en-US/unreal-engine-5.2-release-notes/ https://docs.unrealengine.com/5.2/en-US/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/
UE 编辑器使用:Derived Data Cache Separate source and derived data √ Compressed textures Shader code √ Optimized meshes Different representation per platform √ When engine needs derived data for platform √ Key = asset + target platform, Request key from DDC Server Many advantages √ Doesn’t bloat .uasset size √ Change processing without touching .uasset
https:/github.com/Allar/ue4-style-guide https://github.com/skylens-inc/ue4-style-guide
Lua Plugin for UE slua-unreal https://github.com/Tencent/sluaunreal UnLua https://github.com/Tencent/UnLuaunreal 引擎的插件 通过unreal反射能力,导出蓝图接口和静态c++接口给lua语言口支持lua到c++双向,lua到蓝图双向调用
https://docs.unrealengine.com/zh-CN/Programming/Development/CodingStandard/index.html
AGDE Android 调试
游戏模式
目录 UE4GamePlay 关键元素 游戏世界的规则与状态保持 世界中的“生命体” 其他必不可少的元素 网络同步 值同步 RPC 联机加入对局 连接对局流程 角色控制 角色和游戏流程的关联 多人联机支持 案例分析:多人联机枪战游戏
游戏世界的规则与状态保持 概要 GameMode GameMode 制定的规则 GameMode中的关键方法 案例 预置的基础GameMode AGameMode解析 设置Game Mode GameState 关键的函数和变量 PlayerState
GameMode制定的规则 玩家和观众数量,以及允许的玩家和观众最大数量。 “玩家进入游戏的方式”,可包含选择生成地点和其他生成/重生成行为的规则。 基于规则的事件在游戏中发生,需要进行追踪并和所有玩多享时,信息将通过Game State讲行存储和可步这些信息包括目不限: 2.每个个体玩家加入游戏的时间和玩家的当前状态。 3.游戏是否已开始。
GameMode中的天键方法 InitGame PreLogin PostLogin HandleStartingNewPlayer RestartPlayer SpawnDefaultPawnAtTransform Logout
InitGame在所有Actor激活之前调用(执行PrelnitializeComponents之前)Beginplay。 PreLogin 4接受或拒绝尝试加入服务器的玩家。如它将 ErrorMessage 设为一个非空字符串,会导致Login 函数失败。 PostLogin 成功登录后调用。这是首个在PlayerController上安全调用复制函数之处。OnPostLogin暴露给了蓝图中,用于方便添加额外的逻辑。 HandleStartingNewPlayer在PostLogin后或无缝游历后调用,可在图中覆盖,修改新玩家身上发生的事件。它将默认创建一个玩家 pawn RestartPlayer 调用开始生成一个玩家pawn。如需要指定Pawn生成的地点,还可使用 RestartPlayerAtPlayerStart和RestartPlayerAtTransform函数。OnRestartPlayer可在蓝图中实现,在此函数完成后添加逻辑。 SpawnDefaultPawnAtTransform这实际生成玩家Pawn,可在蓝图中覆盖。 Logout 玩家离开游戏或被摧毁时调用。可实现OnLogout 执行蓝图逻辑。(断线重连)
预置的基础GameMode 特定的基础(如进行游戏所需要的玩家数量,或玩家加入游戏的方法)在多种类型的游戏中具有共通性。可根据开发的特定游戏进行无穷无尽的规则变化。无论规则如何,Game Modes的任务都是定义和实现规则。Game Modes当前常用的基类有两个。 AGameModeBase,这是所有Game Mode的基类,是经典的AGameMode简化版本。 简洁高效,是默认的游戏模式。 AGameMode是AGameModeBase的子类。AGameMode更适用于标准游戏类型 (如多人射击游戏),以比赛状态概念作为实现。
AGameMode解析 AGameMode包含一个跟踪比赛状态或整体游戏流程的状态机。可使用GetMatchState 或 HasMatchStarted,IsMatchInProgress 和 HasMatchEnded之类的封装器查询当前的状态。
URL 作为启动参数,指定GameMode UE4Editor.exe/Game/Maps/MyMap?game=MyGameMode-game配置默认的GameMode 可在DefaultEngine.ini文件的/Script/Engine.WorldSettings/部分中设置地图前缀(和URL法的别名)。 这些前缀设置所有拥有特定前缀的地图的默认游戏模式。 [/Script/EngineSettings.GameMapsSettings] +GameModeMapPrefixes=(Name=“DM”,GameMode="/Script/MyGameMode.MyGameMode") +GameModeClassAliases=(Name=“DM”,GameMode="/Script/MyGameMode.MyGameMode")
GameState包含要复制到游戏中的每个客户端的信息,简而言之,它表示每个联网玩家的"游戏状态"。它通常包含有关游戏分数、比赛是否已开始和基于世界场景玩家人数要生成的AI数量的信息,以及其他特定于游戏的信息。 GetServerWorldTimeSeconds对于多人游戏,每个玩家的机器上都有一个游戏状态实例,GetTimeSeconds的服务器版本,保持客户端和服务器上时间的同步。 PlayerArray存储了所有玩家的APlayerState,方便遍历和获取玩家数据信息。 HasBegunPlay 游戏世界中的Actor已执行Beginplay,则返回true。
一个很有用的类Gamelnstance:submodule 存在于整个游戏的生命周期,不随着地图的切换和销毁,非常适合非业务逻辑的全局管理操作。
PlayerState游戏玩家的状态,例如人类玩家或模拟玩家的机器人。作为游 景的一部分而存在的非玩家AI将不会拥有玩家状态。 对于多人游戏,所有玩家的玩家状态存在于所有机器上(与玩家控制器不同),并且可以将数据从服务器复制到客户端以保持同步。
世界中的生命体 Actor:存在于游戏世界中最基础最简化的“生命体”。 Pawn:可被Controller Possess,且可将其设置接受输入,用于执行各种各样类似于玩家的任务。请注意,Pawn不被认定为具有人的特性。 Character:角色是类人式的Pawn。默认情况下,它带有一个用于碰撞的胶囊组件和一个角色移动组件。它可以执行类似人类的基本动作,可以流畅地复制网络上的动作,还具有一些与动画相关的功能。
网络同步 网络角色NetRole authority autonomous simulate值复制(server) 相关性的概念(相关时同步actor+最新状态)Actor状态的保持(ActorChannel)Server–>Client(可靠的,及时的)
网络同步 RPC(server client)valid(damage10000:100,return false.) 两种设置 Reliable(pitfall) Unreliable(server→client,udp) 类型 Multicast Run on Server client–>server Run on OwningClient:角色+背包(发光)server-→client specific show.
https://share.weiyun.com/5dZwtrD
案例下载 定制了一个新的session,用于支持Dedicated Server建立Session,广播对局信息CustomCreateSessionCallbackProxy.cpp CustomCreateSessionCallbackProxy.h启动独立server,客户端直连:client.bat + server.bat 8613813客户端host一个server:clientWithSession.bat启动独立server,客户端通过session连接:serverWithSession.bat + clientWithSession.bat让案例更有趣?创建会飞的物件:打击物件支持网 络同步移动(加分),固定位置,打击 此物件额外加分。大条件:限制时 间1mni,2?ul:
UE4的C++代码规范
命名 清晰、明确、避免过度缩写 变量名:大驼峰式(CamelCase),bool类型须加b前缀 引用传入可能修改的函数变量:加Out前缀
游戏中的3D数学 目录
- 向量
- 线性变换及对应矩阵
- 旋转变换及其表述
- 齐次坐标系下的矩阵变换
UMG 界面
HUD Slate UMG
1.什么是UMG? Unreal Motion Graphics Ul Designer 虚幻4中基于Slate构建的界面编辑系统 2.做什么用? 编辑界面 布局编辑 界面动画 蓝图中处理交互
如何在 UMG 中创建动画? 控件蓝图编辑器 的底部有两个窗口,可用来实施和控制 UI 控件的动画。第一个是 动画 窗口,可以创建用来驱动控件动画的基础动画轨。第二个是时间轴窗口,用于指定动画如何随时间应用至控件,其方法是在指定的时间上放置关键帧并定义附加的控件在该关键帧如何显示(可以是尺寸、形状、位置甚至颜色选项)。
添加动画关键帧: 在支持关键帧的设置旁边单击 添加关键帧 按钮。 在上图中,每个设置旁边都有一个图标,可以单击这些图标向时间轴的当前位置添加一个该值的关键帧。 在下图中,背景颜色的关键帧添加到了0.00 和 2.00,此处按钮控件的背景颜色在 2 秒内由白色变成黄色。
内存与性能
图集
内存 资源引用形成、解耦 引用形成: 直接摆放在UI的Tree中 变量类型 创建UI时选择的类型 解耦:避免在蓝图中直接访问类型中的方法,通过基类、接口调用不要将各种使用的资源都配置在U1上或者蓝图里使用弱引用 使用类似MVC的设计模式,独立实现界面的数据、视图以及控制逻辑。
性能 不用或少用属性绑定 尽量不在UI蓝图中实现Tick 复杂蓝图逻辑转C++,然后在蓝图中调用C++实现的函数 正确设置"隐藏"(Hidden <==> Collapsed) 无效框: 无效框可以缓存UI绘制的中间数据,减少绘制的CPU消耗 合理结构提升渲染性能: 减少UI层级,从而减少UI绘制过程的递归调用 合理规划UI层次,合并图集,批量渲染以减少DrawCall
作业:为目前的Demo添加类似下面的游戏界面:包含角色的个人信息,基础操作按钮,计分显示。 可选:添加一个得分排行榜,排行数据可使用SaveGame保存于本地,得分进入榜单时可编辑自己在榜单上显示的昵称。
目录
- 骨骼动画原理
- UE4动画蓝图
- 常用动画资产
- 常用动画节点
- 资源获取
SkeletalMesh:骨骼网格体,主要的渲染资源 Skeleton:骨架,定义了骨骼的层级结构 在UE4中,骨架资源将关联动画数据,骨架资源将把骨骼(关节)数据关联到动画轨迹,从而驱动动画。 PhysicsAsset:物理资产,关联各骨骼和物理世界的交互
Event Graph 与普通蓝图的Event Graph类似,可以在BeginPlay、Tick中添加逻辑 Anim Graph 用于逐帧生成动画Pose,可以进行AnimSequence的采样、混合、骨骼变形等操作,最终产生想要的Pose
Local Space&Mesh Space Local Space下,Pose中保存的每个骨骼的变换数据为相对父骨骼的变换 Mesh Space下,Pose中保存的每个骨骼的变换数据为相对骨骼模型组建的变换
BlendSpaces提供了很便捷的多动画融合功能,通过传入参数值动态计算各个动画的权重输出融合后的结果,可以省去程序或者美术编写复杂的动画融合节点
Montage是一种在编辑器中创建的动画资源(非导人),它可以由若十个AnimSequence组成,通过其设置的Section和Slot,可以实现一些特殊的动画控制,包括动画的智能循环、基于逻辑的动画切换等等
一个Montage可以设置若干个Slot,具体哪个slot生效,由运行时刻AnimGraph的情况决定 每个Slot中可以拖入若干个AnimSequence,顺序可以按需更改。如果AnimSequence为叠加型动画,则这个Montage也为叠加型Montage Montage可以有若干个Section,Section把整个Montage拆分成若干块,这些块之间可以自由的衔接和跳转 Montage的属性页可以设置此Montage在播放时的淡入和淡出融合,使动作不会显得很突兀 如果Montage所使用的AnimSequence勾选了RootMotion,则这个动画在播放过程中根骨骼的位移会使角色产生移动。这个功能要与CharacterMovement组件配合。移动组件在更新速度时会优先使用根骨骼位移来作为移动的值。注意:根骨动画需要客户端和服务器同时播,如果服务器不播动画或者时间差太多,客户端会被拉扯
ApplyAdditive:在LocalSpace下把一个动画叠加到另一个动画上(前面有提) ApplyMeshSpaceAdditive:在MeshSpace下执行叠加Blend:把两个Pose根据Alpha参数作为权重进行混合BlendBoneByChannel:可以指定一根骨骼与另一根骨骼进行混合(不常用) BlendMulti:同时对多个pose进行混合,与Blend同理
https://docs.unrealengine.com/4.27/zh-CN/AnimatingObjects/SkeletalMeshAnimation/
01 游戏物理的基本概念 02 虚幻引擎的物理应用 03 未来发展 物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动、旋转和碰撞反映实现包括布料,破碎,粒子等各种酷炫的物理效果
目前主流的物理引擎 PhysX属于NVIDA,现已开源,是UE4和Unity的主要内置物理引擎,使用它的游戏非常多Havok老牌的商业引擎,代表作品包括:刺客信条,Doom Eternal,Monster Hunter World等1381357 Chaos Epic Games自研的新一代物理引擎,是UE5的唯一物理引擎;特性包括布料,破坏,双精度等,目前仍处于测试阶段 其他 Bullet Physics(开源) Newton Dynamics(开源) 以下如未特别说明,一般以Chaos和PhysX作为代表
游戏物理世界的基本组成 Body和Shape:Body是游戏物理引擎的基本模拟对象,它包含着一些基本状态,例如位置,旋转,动量和角动量等等;Body本身没有碰撞功能,碰撞功能是由附着在其之上的Shape提供的,一个Body可同时拥有多个碰撞体,以逼近视觉体验 Simulated:拥有完全模拟特性的Body Kinematic:外部驱动的物理体,拥有无限质量,常用于游戏中一些按轨迹移动的机关,Kinematic之间没有碰撞 Constraint:这是一类抽象实体,用来描述Body自身和Body之间的运动限制,一般最常见的是Joint Constraint,它连接着两个Body,提供了6个自由度(3轴平移和3轴旋转)的限制功能 物理引擎假设的是一个刚性的世界,就Body和Shape本身而言没有变形和塑形的功能,以下会用刚体一词来代称Body
物理引擎中的各种Shape解析类型( 最常用,效率最高的碰撞类型)Sphere Capsule Box Plane Convex Meshes(凸多边形,性能一般) Triangle Meshes(任意多边形,性能较差) Height Fields(高程,主要用于地形)
检测(Trace)和模拟(Simulate)检测:主要是场景进行相关的碰撞检测,返回查询结果,一般分为以下三种Raycast,射线检测 Sweep,给定一个直线轨迹,用几何Shape去测试Overlap,给定一个Transform,用几何Shape去测试 模拟:相当于把物体的运动托管给物理系统,不需要任何的接口调用,通过simulate对场景进行模拟 碰撞通道 在同一个物理世界中,经常需要将模拟对象相互隔离,所以要引入碰撞通道的概念 Channel(也称为Object Type)和响应关系 刚体拥有一个Channel和一张碰撞响应表 对于检测,API会给出反应Channel碰撞体也建立芳东两个刚体的碰撞响应表对彼此的Channel都有响应,才产生碰撞 可以在Project Settings中添加新的通道 三种响应 对检测和碰撞都没有反应 Overlap 重叠(检测时不阻挡射线,模拟时无碰撞) (检测时会阻挡射线,模拟时有碰撞) 碰撞预设(也称为Profile) 刚体Channel和碰撞响应表组合 UE默认提供了一组预设,也可以在Project Settings中添加新的预设在刚体上自定义 注意:Profile和Channel往往拥有同一个名字,但它们不是一回事,不要混淆 物理材质 记录物理参数的资源格式,包含若干个物理相关的参数 可被链接在渲染材质上,方便管理 也可直接在蓝图和实例上覆盖 Skeletal Mesh Physics 骨骼模型的顶点会参与蒙皮动画的计算,位置会随动画变化 采用基本几何体和凸包,配合约束作为骨骼模型的Physics Asset 理论上,可以添加Complex/Triangle Mesh作为碰撞体但很少这么做 物理动画,基于动画及真实物理模拟插值的动画系统,应用到骨骼模型上。 基本刚体+约束组成 骨骼动画更新获取骨骼矩阵 刚体基于当前数据,模拟之后获取物理数据基于一定权重做动画与真实物理的融合,得出最终的骨骼位置
Skeletal Mesh Physics除了角色的Ragdoll,Skeletal Mesh Physics还可以应用在其它场合,比如车辆
优化的基本原则 降低物理场景的复杂度 挑选合适的模拟参数挑选合适的迭代次数 使用合理的帧率 使用合适的查询方法 降低碰撞盒查询得到的对象数量 降低物理查询本身的损耗 返回单一结果 使用异步方法进行批量查询 使用“替代物理” 根据应用场景定制规则 与主物理世界隔离 能进行针对性的优化
发展方向 Tighter integration with gameplay Deterministic Simulation Big World Deformable GPU Acceleration More data driven,more intelligence