[GENERIC]知识总结
知识总结
1. AI
寻路
路径规划之 A* 算法
[译]寻路优化
JPS/JPS+ 寻路算法
在AI寻路决策中运用势力图(Influence Map)
LPA* 与 D* Lite
NavMesh 生成算法
A* 的估价:设起点为 S、终点为 T,可以选择 D0 * ManhattanDist(S, T) + D1 * abs( Cross(Se, Te) )
其中 D0 = 2,D1 = 0.001
2. 动画
骨骼动画
骨骼动画原理
3. Gameplay
基础
Effective C++
架构
浅谈《守望先锋》中的 ECS 构架
漫谈Entity Component System (ECS)
4. 工具流
引入第三方库
c++库文件的理解
5. UI
6. 网络
预测、和解、插值
技能系统与网络同步
KCP
7. 物理
碰撞
多边形碰撞检测
SAT:每个方向的投影都有重叠部分则图形碰撞。实际上不需要检测所有方向,二维使用 每条边 的法向量检测;三维使用 每个面 的法向量、两个图形的边两两组成的面 的法向量进行检测即可。
GJK、GJK
两个图形的闵可夫斯基差包含原点则图形碰 ...
[UE]知识总结
知识总结
1. 3C
CharacterMovement
《Exploring in UE4》移动组件详解[原理分析]
UE4移动的网络同步
2. AI
寻路
UE4 Navmesh寻路
UE4 的 RecastDetour 组件
UE4 主要使用 RecastDetour 组件主要支持 3D 场景的导航网格导出和寻路,也就是 NavMesh
行为树
UE4行为树详解
[UE4][AI] 浅析UE4-BehaviorTree的特性
3. 动画
虚幻引擎里的运动学研究
UE 动画系统框架介绍及使用
4. Gameplay
GAS
GAS Documentation
GAS 快速入门
GAS架构分析
UE的GAS原理深入探究
GAS 探究
GAS 分析
ApplyGameplayEffect 流程
UE5Lyra动作角色GAS功能实现拆解
5. 工具流
插件基础
插件与模块
UE4编辑器如何生成和共享插件
[UE4]无插件源码编译和打包工程
How to Make Tools in UE4
注意事项
在同一个插件模块里面定义的全局静态变量共享。(在 A.cpp 中定义 static i ...
[UNITY]知识总结
知识总结
1. AI
2. 动画
动画基础
学习笔记 — Unity动画系统
Procedural Animation
Unity里的Procedural Animation
解决方案
Playable API:定制你的动画系统
Animancer
3. Gameplay
架构
GameFramework 解析
Unity DOTS:目录
协程
Unity 中的协程
地形
大世界GPU Driven地形入门
4. 工具流
反编译
dnSpy
编辑器
Odin常用功能整理
技能编辑器
技能编辑器的设计实现
5. UI
6. 网络
多人网络游戏同步探究
7. 物理
8. 渲染
渲染基础
Unity Shader 入门精要
卡通渲染
从零开始的卡通渲染
9. 性能优化
内存
【笔记】Unity内存分配和回收的底层原理
Unity游戏内存分布概览
[UE]FModel资源解包流程
FModel资源解包流程
基于 FModel 的资源解包方案
USMAP 生成
通过 DLL 注入工具 DLL Injector 将 UnrealMappingsDumper 注入到对应的游戏进程中:
Inject 后,会弹框并生成对应的 .usmap 文件
AES Key
下载 AES_finder,将 AES_finder.exe 放在对应游戏目录下并运行,得到 key.txt,其中的内容就是 AES Key,即 Advanced Encryption Standard 密钥;
FModel
下载 FModel,将目录选定到需要解包的游戏目录,设置对应的 UE Versions:
打开后,可能会弹出如下报错:
检查如下目录:./FModel/Output/.data ,发现存在未解压的压缩包,将其解压后 Restart:
正常打开后设置对应的 Mapping File 为之前生成的 .usmap:
然后会发现左侧已经识别到对应的 .pak,但是 [WRN] Could not load virtual paths, plugin manifest may not e ...
[UE]网络时钟对齐解决方案
网络时钟对齐解决方案
由于网络延迟等问题,Client 时间与 DS 时间可能不同。
对于 Client 需要有一个接近正确的 GetServerWorldTime 来获取当前 DS 的时间戳,尽可能保证在 DS 与各个不同的 Client 中,同一时刻该值唯一。
GameInstance
通过 GameInstance 来存储一些时间数据记录,最后保证所有读取数据从这里访问:
123int64 StartTicks = 0;float WorldSeconds = 0;float ServerWorldSeconds = 0;
首先在 UGameInstance::Init() 时,记录 StartTicks = FDateTime::Now().GetTicks();
后续在 GeServerWorldTimeSeconds 时,对 ServerWorldSeconds、WorldSeconds 进行更新;
ServerTimeSynchronizer
Register
在 Client 的 PlayerController 成功 Received 时,进行对时校验的注册,每隔 S ...
[UE]ReplicationGraph应用
ReplicationGraph应用
简介
UnrealEngine 基本的网络同步在进行同步时需要对每个连接判断每个 Actor 是否需要同步,开销较大;
可以通过实现 Replication ,实现一个不同的 ReplicationDriver 来优化性能;
Replication 将 World 分为多个区域 Grid,把 Actor 根据所在 Grid 进行分类编组,可以快速找出需要同步的 Actor,同时确定哪些区域需要进行同步复制。
基本原理
对于需要按照空间划分(Spatialize)的 Actor 来说:
首先将 World 按照 CellSize 抽象成一个个 Cell,一个 Cell 对应一个 GridNode,这里的 GridNode 只会在具体用到的时候再创建;
那么对于一个 Actor,根据 Location、CellSize、SpatialBias,就可以计算出其所在的具体 Cell,即 GetCellInfoForActor;
构建
构建 ReplicationGraph 时,在 GridNode 中记录 Actor;
对于 Actor,就可以根据 Ce ...
[UE]Subobject同步优化
Subobject同步优化
基于 PushModel 的 Subobject 同步优化;
基本机制
UE 提供了 PushModel 机制:
对于 Property 这一层,通过 UEPushModelPrivate::MarkPropertyDirty 主动将其标记为 Dirty;
在 FObjectReplicator::ReplicateProperties_r 进行属性同步时,通过 PushModelState->IsPropertyDirty 判断属性是否 Dirty ;
既然可以判断一个同步对象上的同步 Property 是否有变更,就可以筛选出没有属性变化的对象;可以在 UActorChannel::ReplicateActor、UActorChannel::WriteSubObjectInBunch 时,判断 FObjectReplicator::CanSkipUpdate 跳过这些对象,加快同步速度;
12345678910111213141516171819202122232425262728293031bCanSkip = true;// Have the ...
[UE]《极品飞车:集结》
《极品飞车:集结》
Intro
“SPEED IT UP, RACE TO THE TOP.”
Gameplay & AI.
MostWanted & CaptureTheFlag
22.03.17 - 24.07.11
Download
MostWanted
热力追踪
CaptureTheFlag
夺旗
Dev Part
负责的模块
[UE]Command解决方案
Command解决方案
基本的命令框架,由 Command、CommandHistory、CommandManager 组成;
Command
classDiagram
direction LR
class TCommand {
CommandType : TCommandType
CommandParams : FCommonVariantParams
CommandTargets : TArray~TStrongObjectPtr[UObject]~
}
TCommand
[UE]InputSystem基础框架
InputSystem基础框架
Key
flowchart LR
Input(PlayerController::UpdateInput)
Input
-->InputProcesssor::Tick
Input
-->InputHandle::Tick
Input
-->InputCollector::Tick
InputProcessor
对于 InputProcessor,进行按键的原始输入处理,调用 InputKey 将将数据传递到 InputCollector,继续后续的操作;
通过监听引擎原始的按键数据 APlayerController::IsInputKeyDown(const FKey Key);
允许外部调用输入,执行 InputKey (比如某个 UI 点击触发输入);
特别地,在 Tick 中进行原始数据处理;
由于一般按键输入支持 Ctrl / Shit / Alt / Cmd + Key,需要对这种情况适配,同时防止按键冲突:对于KeySetting(KeyType - 具体按键配置 映射) 额外维护 bCtrl (需要与 ctrl 组合)、Must ...