[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
UE的GAS原理深入探究
GAS Documentation
GAS架构分析
GAS探究
SplashDamage的技术负责人的GAS介绍
UE5:Lyra示例项目
UE5Lyra动作角色GAS功能实现拆解
5. 工具流
插件基础
插件与模块
UE4编辑器如何生成和共享插件
[UE4]无插件源码编译和打包工程
How to Make Tools in UE4
注意事项
在同一个插件模块里面定义的全局静态变量共享。(在 A.cpp 中定义 static int ...
[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]PlayerInfo高频同步解决方案
PlayerInfo高频同步解决方案
描述
需求目的
分析一个常见的需求: “在 1P 客户端显示 3P 的 Transform ”。
显然,在客户端存在 3P 的 Pawn 时,可以直接取 Pawn 的 Transform;但出于性能考虑,会进行各种 AOI 机制,在较远距离时客户端会将 3P 的 Pawn 裁剪掉,只留下 PlayerState(或者某个不被剪裁的数据 Channel) 用于同步。
一个直观的想法是将 Transform 直接通过对应的 PlayerState 属性同步给所有客户端;但出于性能考虑,对于同步一般会开启 PushModel;这种高频字段会频繁将 PlayerState 对应 ActorChannel 给 MarkDirty,导致 PushModel 功能基本失效,频繁进行同步的 Diff 等大开销的操作;
所以需要一个机制对这种情况进行优化。
核心思路
对于 DS,创建一个 Channel 专门用于同步 Player 的高频变化信息,如 Location、Rotation 等;
对于同步的信息,进行适当的同步降频(不需要每帧同步)、字节压缩(舍弃部分精 ...
ACT浅思
ACT浅思
ACT 表现
动作
动作节奏:
flowchart LR
前摇--->攻击判定--->后摇-->后摇-可打断
需要控制好每个阶段的时间分配,表现不同的节奏;
较长的后摇可以方便玩家明确下一步操作(不攻击、打断后摇继续攻击),判定更明确;
较短的后摇可以增加动作连续性连续,提升手感;
动画配合:
动画曲线配合:从动画中提取曲线,配合曲线调整位移;比如移动,需要在脚落下的那一刻位移速度最大,其余阶段几乎不位移;
攻击方、受击方动画、位移需要匹配;
受击表现:
受击动作,可以有夸张的表现,具体在 硬直、击退、击飞 等;同时可以添加骨骼抖动强化受击反馈;
爽感优化
顿帧:伤害越大顿帧越久,一般发生在 攻击方接触受击方、技能或连招开始与结束时;
连招:较长的连招(意味着更大的风险)过后,可以添加夸张的收尾表演,释放压力;
终结技:目标强僵直、残血时可以添加慢镜头终结技;
镜头
运镜逻辑:
镜头内容:需要保证全程看清目标,更多以目标为核心;需要保证目标完整在镜头内(尤其是使用大位移技能时);尽量避免主角与目标重叠;
镜头构图:可以稍微错位,可以看清目标动作;
...
[UE]ReplicationGraph源码浅析
ReplicationGraph源码浅析
简介
UnrealEngine 基本的网络同步在进行同步时需要对每个连接判断每个 Actor 是否需要同步,开销较大;
可以通过实现 Replication ,实现一个不同的 ReplicationDriver 来优化性能;
Replication 将 World 分为多个区域 Grid,把 Actor 根据所在 Grid 进行分类编组,可以快速找出需要同步的 Actor,同时确定哪些区域需要进行同步复制。
数据结构
classDiagram
class UReplicationGraph
FGlobalActorReplicationInfo :同步的 Actor 信息,包括
Settings:FClassReplicationInfo,每个 Actor Class 对应的同步配置,包括 CullDistance、ReplicationPeriodFrame、PriorityScale 等;
Events:FGlobalActorReplicationEvents Events,记录休眠状态的改变时,从休眠列表中添加或者移除;
...
[UE]Networking源码浅析
Networking源码浅析
定义
Bunch:表示一组相关的网络数据,包含 RPC / 属性同步 等信息,UE 中 DS/Client 通信的基本单位。
Packet:UDP 的基本传输单位,可以打包一个或多个 Bunch,在接受端进行解析。
NetDriver:管理网络通信,比如管理连接、处理数据包的发送和接收、处理网络事件。
NetConnection:表示一个网络连接,与一个 NetDriver 关联,并通过 NetDriver 进行实际的网络通信。
Channel:管理网络传输,进行数据分类,提供 SendBunch、ReceivedRawBunch 方法,由 NetConnection 管理,一个 NetConnection 可以包含多种 Channel。
FObjectReplicator:处理对象的网络同步,保存属性快照,进行状态改变发送、更新同步状态、接受与发送消息。
ActorChannel:关联特定的 Actor 负责其同步,包含多个 FObjectReplicator 用于复制其 Actor、ActorComponent 。
FRepLayout:管理复制的 ...
[UE]弱网工具Clumsy的使用
弱网工具Clumsy的使用
Clumsy 用于弱网测试时,进行本地弱网环境的模拟,基于 WinDivert 实现,可以出模拟延迟、丢包等网络状态。
Downloads
下载地址:Clumsy;官方文档:Clumsy Manual
下载后的几个重点文件:
打开 Clumsy.exe 可以看到以下内容:
可以看出这里有几个重点的 Function,一般重点使用 Lag 延迟、Drop 丢包。
在 Filtering 填入对应的 Command 后,设置 Functions,点击 Start 即可开始模拟。
同时可以在 Config.txt 中,预设一些 Presets 方便下次使用。
UE DS 中的使用
对于 UE的 DS 环境,首先为了具体到某一个 Client / DS,采用 Filter Port 的机制,对某个具体的端口号进行操作。
用 netstat -aon\Findstr 进程ID,查询 DS/Client 进程,通过 UDP 进行链接。
DS 的 port 一般可以在启动命令中找到 -port=17777;
Client 的 port 可以在 DS 的 Log 中, ...
[UE]夺旗模式框架
夺旗模式框架
描述
夺旗模式:
场景里会按照一定的规则刷新出不同类型的旗帜(不同类型的旗帜有不同的得分、血量、表现等);
玩家会被分成若干个队伍,抢夺刷新出来的旗帜,将旗帜带到自己队伍目标点进行销毁,则可以获得分数;
玩家持有旗帜时,旗帜可能会掉落或被抢夺:被其它玩家撞击到则旗帜被抢夺到其它玩家身上;旗帜的血量归零则会掉落回场景;
有正式赛与加时赛两种类型的比赛,首先会开启正式赛;对于正式赛,率先达到目标分的队伍获胜;如果平局则开启加时赛,否则进行结算;对于加时赛,率先得分的队伍获胜,如果平局则以两队平局进行结算;
要点总结:
旗帜实体:旗帜本身有自己的类型、得分、血量;
旗帜刷新:场景内根据一定规则(倒计时刷新、旗子上缴)会刷出不同类型旗帜;
旗帜传递:玩家可以拾取场景里的旗帜、相互抢夺旗帜、掉落旗帜(持有旗帜血量归零)、将旗帜送给终点得分等;玩家可以组队,共享队伍得分;同队伍之间的玩家可以传递旗帜;
单局流程:所有玩家就绪分队后,传送到起始点准备开赛;如果一局比赛平分,一定条件下可以触发下一场比赛继续;
模式基础
单局流程
首先,一个完整的夺旗赛,由若干个子比赛构成,子比赛 ...
[UE]CommonParams解决方案
CommonParams解决方案
在实现业务框架的时候,经常需要支持传参的功能(比如 Buff 系统中,AddBuff 的时候,通常需要支持外部传入一个 BuffParams ,在内部解析出各种 Param 使用。)
这个参数需要支持基本的数据保存、同步等。
初始的想法
一个最简单的想法,是打包一个结构体,支持各种类型的传入,比如:
12345678910USTRUCT()struct Params{ UPROPERTY() uint64 uVar0; UPROPERTY() int iVar0; UPROPERTY() float fVar0;}
这样虽然很简单,同时可以通过反射来同步。
但是有一个巨大的问题,那就是在解析参数的时候,只知道 Var0 这种没有名字的抽象的概念,使用者需要记住 Var0 对应的是什么数据,很不直观。
CommonVariantParams
维护一个 CommonVariantParams,通过 TMap <FString, FVariant> ValueMap 来保存数据,同时自定义 ...