编程模式
学会抽象
“公共代码”和特定代码划分
架构:MVC
Model, View, Controller:数据、视图、控制器
简单来说就是用户对视图产生操作,通过 Controller 来更新数据,Model 更新数据之后,通知 Controller 来更新视图。
架构:MVVM
MVVM 本质上还是 MVC
框架积累
物理:物理引擎杂谈
https://blog.yusong.me/game/physics
物理:Bullet physics engine
项目和官网:
https://github.com/bulletphysics/bullet3?tab=readme-ov-file https://pybullet.org/wordpress/
相关演示视频:
主要特点(从上面的视频中总结):
- 确定特性:Bullet Physics 每次都产生确定的结果,比如同样的位置丢圆锥,Unreal 每次的碰撞角度、旋转方向都可能不一样,但是BulletPhysics每次都保持同样的旋转方向、摩擦力等。
物理:AABB、OBB 等
配置:LuBan
官网:
用 Excel/JSON 等做配置表,LuBan 编译生成对应的二进制/JSON/Proto 格式,再导出多语言的数据类(C#/Java/Go/Lua 等)。
序列化与反序列化:FullSerializer & OdinSerializer
FullSerializer
- 一个 开源的 C# 序列化库。
- 特点:
- 支持 JSON 序列化/反序列化。
- 处理 Unity 常见类型(Vector3, Color 等)。
- 在 Unity 开源社区比较流行,常用于替代 Unity 内置的
JsonUtility
(功能更强)。
- 使用场景:
- 保存游戏存档为 JSON。
- 与服务器通信。
OdinSerializer
- 是 Odin Inspector 插件 的序列化核心模块(也可独立使用)。
- 特点:
- 支持 Unity 不支持的类型(如字典、接口、多态对象、循环引用等)。
- 可序列化到二进制、JSON、甚至 Unity 对象。
- 编辑器友好:Odin Inspector + OdinSerializer 能让任何复杂数据在 Inspector 面板显示并保存。
- 使用场景:
- 如果项目里需要存储复杂对象(例如:带有字典、泛型、接口引用的对象),OdinSerializer 能解决 Unity 内置序列化做不到的事情。
- 大型 Unity 项目里常用来做 配置存储、存档系统。
序列化协议:Protobuf
Protocol Buffers,Google 开发的 高性能、跨语言的序列化协议。
把对象转换成紧凑的二进制格式,方便存储和网络传输。 特点:
- 跨语言(C#/C++/Java/Go/Python…),只要写一个
.proto
文件定义结构,就能生成不同语言的类。 - 高性能:比 JSON 更快更小(网络游戏常用)。
- 版本兼容性强:旧客户端和新服务端能在一定程度上互通。
定点数与浮点数
- 浮点数 (float/double):常见的
float x = 0.1f;
,底层用 IEEE 754 标准表示。优点是范围大,缺点是 不同平台/CPU/GPU 上浮点运算可能结果不完全一致。 - 定点数 (fixed-point):用整数模拟小数。例如:
- 我们约定
1000
表示1.000
,那1234
实际表示1.234
。 - 所有运算都用整数进行,只在显示时换算成带小数的形式。
- 没有浮点误差问题(只要约定的精度一致)。
- 我们约定
PCG 随机数生成
特点:
- 更好的统计性质,减少序列相关性(就是更随机?)
- 支持多流,方便并发使用
- 高维均匀分布
- 性能优秀,快于 System.Random
总结:高质量、高性能且低相关性
化学反应系统 🔥💧
参考塞尔达的化学反应
音频:SoundManager
主要是记录一些 SoundManager 可以设计的属性 Force To Mono:强制改为单声道 Load In Background:后台加载 Preload Audio Data:进入场景时预加载音效 Load Type(压缩Type)
- Decompress On Load: 声音一旦被加载就会解压储存内存中。会占用内存,播放时不会消耗cpu算力
- Compressed In Memory: 声音在内存中以压缩的形式储存,等播放时再解压。这种方式有cpu消耗,但节省了内存。
- Streaming: 播放时解码。这种方式占用内存最小,却增加了I/0和CPU的消耗。基本上只有bgm等大的音效才会采用。 Compression Format:
- PCM、ADPCM、Vorbis
Unity:插件
Animancer vHierarchy RayFire DmmProFx Procedural Walk Animation EasyCollider
相对于 MeshCollider,可以自定义顶点,减少 Collider 的三角面,增加性能 https://www.youtube.com/watch?v=qcGa_mzjc8Q Hot Reload Smart Library LuBan