学习更新
游戏客户端
作业
1.迭代开发
2.github链接
3.工程代码 资源 apk安装包 游戏运行的mp4视频
Android安装包和视频
UE入门
作业:
1.源码编译UE4/5新建一个C++工程,进行简单场景编辑和工程设置
2.编译并构建安装包,确保能够用来将游戏工程安装到手机正常运行
只上传需要的代码
游戏引擎简介#
- UE:
高渲染品质,PBR渲染,先进的着色模型
成熟的美术资产制作管线
C++与蓝图 性能和可视化并重
开发周期 基于射击类的Gameplay框架
跨平台
开源 - unity:
- cryEngine 开源
- open 3d engine 开源
- Idsource -> source2 3Dfps游戏 1992 德军总部
- Frostbite Engine
《Game Engine Architecture》
游戏引擎:通用性与偏向性,可扩展性,完善工具链
Game engine are data-driven architectures that are reusable and therefore do not contain game content
游戏行为全部或部分由美术或者策划提供的数据控制
渲染#
推荐课程 Games101,Games202,《REAL-TIME RENDERING》
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"
游戏引擎渲染
渲染架构
1.Immediate Mode Rendering
2.Tile Based Rendering
3.Tile Based Deterred Rendering
游戏引擎物理
碰撞检测 动态约束 刚体物理 车辆物理 布娃娃系统
UE介绍#
背景介绍#
Launcher#
编辑器使用#
1.地图关卡的创建和分层
file->new level
两种关卡:persistent level streaming level
2.导航
3.可视化界面
4.选取
5.属性设置
6.安放与对齐
贴地 end 中心点贴地
7.快速迭代
8.volumn
9.资产管理
Content Browser
UE4资源为.uasset文件,非ue4资源单独文件夹放置
资产迁移 migrate 保证资产完整性
ddc:derived data cache
满足不同平台的不同需求
separate source and derived data
different representation per platform
项目结构#
world -> level -> sub-level
sub-level:类似pubg的格子,只加载玩家周围的场景
actor: 添加到level的角色
component: 添加actor功能
打包:官方文档
file->package project
源码构建#
生成项目
1.运行Engine\Binaries\Win64\VersionSelector-Win64-Shipping.exe 选择引擎
2.选择项目生成sln文件
UE的编译是通过UBT(Unreal Build Tool)来完成的,调用自己的UHT(Unreal Header Tools)预处理头文件,解析头文件中的引擎相关类元数据,产生胶水代码
调用编译器,开始编译
main函数:LaunchEngineLoop.cpp
各个模块之间不能相互包含,都是独立的
UE编程技巧#
游戏框架#
GameMode游戏模式--只存在于服务器端
该类负责设置正在执行的游戏规则
规则可包括玩家如何加入游戏,是否可以暂停游戏、关卡过渡、以及任何特定的游戏行为(例如获胜条件)
GameState游戏状态
包含要复制到游戏中的每个客户端的信息,它表示整个游戏的“游戏状态”。它通常包含有关游戏分数,比赛是否已经开始和基于世界场景玩家人数要生成的AI数量的信息
PlayerState玩家状态
是游戏玩家的状态,非玩家AI将不会拥有玩家状态
在玩家状态中的数据包括玩家姓名或者得分、当前等级或者生命值
Pawn
Actor的一个子类,充当游戏中的生命体
Character是Pawn的一个子类,用作玩家角色,角色子类包括碰撞设置、双足运动的输入绑定,以及由玩家控制的运动附加代码
PlayerController玩家控制器
用于在游戏中获取玩家输入并将其转换为交互
通常选取一个Pawn或者角色作为代表
blueprint#
Level Blueprint
- 自动创建 ,每个Level一个
- 生命周期是整个关卡存在的时间
- 监听level级别的事件
Bluprint Class
- 自己可以随意添加,需要继承已有的类
- 可以添加不同的组件来丰富功能
- 通常被放置在关卡中,执行自身的逻辑功能
Data-only Blueprint
Blueprint Interface
Blueprint Macros
蓝图与C++变量之间要使用 UPROPERTY
UFUNCTION标签来实现蓝图与C++函数的相互调用 非空判断IsValid
Lua
C++
引擎工具#
内置多种调试工具
游戏模式
UE4GamePlay关键元素#
游戏世界的规则与状态保持#
GameMode GameState PlayerState
AGamMode和AGameState都继承于AInfo类
AGamMode控制了世界和关卡的信息
GameMode 游戏模块的核心
状态机,规则指定者,控制玩家生成,胜利
制定规则,仅存在于服务器上,通过改变GameState来与客户端交互
- 制定规则
玩家和观众的数量
玩家进入游戏的方式--出生点 - 控制世界和关卡
- 关键方法
InitGame:初始化游戏,在所有Actor激活之前
PreLogin:接受或者拒绝尝试加入服务器的玩家
PostLogin:成功登录后调用,首个在PlayerController上安全调用的复制函数,在蓝图中里哟OnPostLogin修改
HandlStartingNewPlayer:在PostLogin后调用,修改新玩家身上发生的事件,默认创建一个玩家Pawn
RestartPlayer:调用开始生成一个玩家 pawn,使用RestartPlayerAtPlayerStart和RestartPlayerAtTransform函数修改生成位置
SpawnDefaultPawnAtTransform:实际生成玩家pawn的位置
Logout:玩家离开游戏或被摧毁是调用,在蓝图中为OnLogout
一款游戏可以有多个GameMode,这些GameMode都继承于AGameModeBase子类,但在一个时间只能有一个GameMode。每次关卡进行游戏实例化时 Game Mode Actor 将通过 UGameEngine::LoadMap() 函数进行实例化
AGameMode
AGameMode
AGameModeBase是一个较为基础的父类,如果想拥有一些额外的功能可以从AGameMode父类继承
具体流程:
EnteringMap -> WaiitingToStart -> InProgress -> WaitingPostMatch -> LeavingMap -> Aboted失败状态
UWORLD:BeginPlay->AGameMode:StartPlay->AGameMode:StartMatch->Spawn Actors and begin the game
GameState 启用客户端监控游戏状态
继承于AGameStateBase
GameMode所指定的规则的事件发生时,需要通过GameState进行存储和同步当前的信息
GameState与所有客户端连接,改变信息会同步给所有玩家(PlayerArray)
与所有玩家共享的全局信息记录
Game State 存在于服务器上且会被复制到所有客户端,保持所有已连接机器的游戏进程更新
GameInstance
直接继承UObject,存在于整个游戏的声明周期,适合全局管理操作
PlayerState 玩家个人的信息
AI不会拥有玩家状态
对于多人游戏,所有玩家的玩家状态存在于所有机器上,并且可以将数据从服务器端复制到客户端保持同步
PlayerController 本质上代表了人类玩家的意愿,存在于客户端,PlayerController在整个游戏在过程中都是一直存在的,但是Pawn可能是临时存在的,可以将一些信息存在PlayerController上
世界中的“生命体”#
继承于UObject
Actor:游戏中最基础最简化的“生命体”
Pawn:不被认定具有人的特性
Character:类人的Pawn
"Controller":对Pawn控制的Actor,主要通过Controller来做连接服务器
其他#
HUD:UI--血条,指示器
摄像机:
服务器有有一个NetDriver 通过NetConnection连接客户端
客户端同样也是这样于服务器通信的
联网和多人游戏#
官方
在客户端与服务器间同步数据和调用程序的过程被称为复制(Replication)
服务器将游戏状态信息复制到客户端,客户端使用此信息高度模拟服务器正在发生的情况
游戏状态和流程一般是通过 GameMode 这一 actor 来驱动。只有服务器才包含此 actor 的有效复本(客户端不包含复本)。要向客户端传达该状态,可以使用 GameState actor 显示 GameMode actor 的重要状态。这个 GameState actor 被标记为复制到每个客户端。客户端将包含此 GameState actor 的一个近似复本,而且能使用这个 actor 作为引用,用于了解游戏的一般状态。
网络同步#
网络角色NetRole
利用服务器创建一个Actor并持有它
authority:在服务器上的角色或者AI
autonomous:连接到服务器的客户端上的角色,通过PlayerController连接,与服务器通信
simulate:连接到服务器的客户端上的角色,但是只在本客户端有,不能被操作
值复制(server)
服务器端创建actor 利用值复制保持sever和客户端的状态一致
相关性
相关时同步Actor+最新的状态,
UE4默认玩家在150m以外,客户端不会显示以外的actor
Actor状态的保持(ActrorChannel)
保存对应的Actor值复制的信息,当不相关时销毁,相关时通过ActorChannel与服务器连接
Sever->client
reliable
- 组件复制
静态组件:不会自动复制,不会通过复制存在于客户端,默认存在
动态组件:通过复制在客户端创建和删除
RPC
两个actor不相关时,不会保持,适用于瞬时的状态,不适用保持
unreliable
客户端只能通过rpc与sever通信
Multicast:多播操作 服务端操作,会扩散到所有客户端
- 如果 RPC 是从服务器调用并在客户端上执行,则只有实际拥有这个 Actor 的客户端才会执行函数。
- 如果 RPC 是从客户端调用并在服务器上执行,客户端就必须拥有调用 RPC 的 Actor。
- 多播 RPC 则是个例外:
如果它们是从服务器调用,服务器将在本地和所有已连接的客户端上执行它们。
如果它们是从客户端调用,则只在本地而非服务器上执行。
联机加入对局#
客户端与服务器端的连接
- 客户端发送连接请求。AOnlineBeaconClient::SendInitialJoin()
- 如果服务器接受连接,则发送当前地图。
- 服务器等待客户端加载此地图。
- 加载之后,服务器将在本地调用 AGameModeBase::PreLogin。
这样可以使 GameMode 有机会拒绝连接 - 如果接受连接,服务器将调用 AGameModeBase::Login
该函数的作用是创建一个 PlayerController,可用于在今后复制到新连接的客户端。成功接收后,这个 PlayerController 将替代客户端的临时 PlayerController (之前被用作连接过程中的占位符)。
此时将调用 APlayerController::BeginPlay。应当注意的是,在此 actor 上调用 RPC 函数尚存在安全风险。您应当等待 AGameModeBase::PostLogin 被调用完成。
6. 如果一切顺利,AGameModeBase::PostLogin 将被调用。
这时,可以放心的让服务器在此 PlayerController 上开始调用 RPC 函数。
UE4中的C++代码规范
代码规范#
意义明确
缩进和换行
关键逻辑添加注释
UE4c++代码规范#
代码规范
引用传入若要输出前缀Out
游戏中的3D数学#
向量#
dot product
cross product
基底和坐标
线性变换及对应矩阵#
基底变换,坐标系变换
主要时全局坐标变换到局部坐标
对于在全局坐标系下的点V转换到局部坐标下的点V(坐标数值在相应坐标系下相等,全局坐标下为V')
可得转换矩阵A
旋转变换
距离不变->模长不变
欧拉角
一个旋转可以拆分为分别绕3个轴的旋转矩阵的乘积
3个矩阵的乘积顺序不同,相同的3个欧拉角表达的旋转也不同
欧拉角的原理就是,将旋转角度转换为绕3个标准轴的旋转角度相乘,欧拉角就是由这三个值表示的
局部坐标轴旋转
全局坐标轴旋转
一般为roll(X轴) pitch(Y轴) yaw(Z轴),需要注意的是,欧拉角插值会不是平滑的,可以通过对相机增加限制(yaw pitch)来改善?
万向节锁:
在使用欧拉角来表示旋转时,当Y轴为90、-90的时候,X、Z轴旋转肉眼看上去是错误的,也就是万向锁问题
当三个轴的旋转顺序确定后,中间旋转的轴一旦旋转使得第一个和最后一个旋转轴在一个平面都会出现
绕任意轴旋转
将向量v投影到与轴n垂直的平面上,再将该投影向量绕n旋转,最后将v的起点旋转后的向量相连即可
还有种方法:将n变为x,y,z轴的任意一根,记录相应的变化矩阵,然后相当于现在是一个向量v绕着x,y,z旋转,得到旋转矩阵后,再在前面乘以变换矩阵的逆
旋转矩阵
通过欧拉角构成对应的旋转矩阵
其逆和他的转置相等
单位四元数
易于插值,旋转插值的最佳选项
齐次坐标系下的矩阵变换
仿射变换:线性变换+平移
游戏中多用于坐标空间变换
Scale Rotation Tranlate
渲染:局部->世界->相机->NDC->屏幕
具体参考Games101
1.相机的变换
将相机变换到标准位置
位置,朝向,up direction向上方向
定义标准位置相机在原点,朝向-z,向上方向为y
需要将空间上任意一个相机点(e,t,g)移动到原点上,并且旋转朝向使它成为标准位置
将g旋转到-z,t旋转到y,e旋转到x的矩阵通过先写出x到e,y到t,z到-g的旋转矩阵,由于旋转矩阵是一个正交矩阵,所以其的逆就为其的转置
2.投影变换
正交投影
将空间立方体[l,r]x[b,t]x[f,n]的中心移到原点,然后缩放值1*1*1的立方体
变换矩阵
透视投影
首先将透视投影转变为正交投影,其次再利用正交投影
定义:近平面x,y,z值一定不变,远平面z值不变,远平面中心(0,0,f)不变
首先压缩x,y方向值使得可以使用正交投影
考虑zx,zy平面,利用相似三角形可得以下等式
对于想知道的转换齐次矩阵应当有以下等式
可以得到变换矩阵M的1,2,4行向量分别为(n,0,0,0)(0,n,0,0)(0,0,1,0)
并且可以看到z方向上向量的改变与x,y没有关系,所以第三行可以写为(0,0,A,B)
现在利用定义的两个限制条件来求解z方向压缩后的值
在近平面n上x,y,z的值都不会发生改变(z=n)
可以得到
再利用远平面f上的中心点(0,0,f)同样经过压缩后值不会发生改变有
可以得到
所以A和B可以求得
需要注意此时变换后求得的值不是实际值,但表示的是同一点
最后得到透视投影的变换矩阵为
作者:XTG111
出处:https://www.cnblogs.com/XTG111/articles/17723401.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律