Unity 角色动画模块的组合式重构
最近整理了一次角色动画模块。原先本地玩家、网络同步玩家和 AI 共用一个动画组件,随着手持物、送礼等行为接入,业务层开始出现越来越多“如果是其他玩家,就额外处理一下”的代码。
这次调整主要做了两件事:根据 Animator 的实际驱动方式拆分实现;让角色实体以普通 C# 对象的方式持有动画驱动器,负责它的创建与释放。下面保留这次重构时的思路,说明原先哪里不方便,以及新结构怎样消除这些特殊处理。
最近整理了一次角色动画模块。原先本地玩家、网络同步玩家和 AI 共用一个动画组件,随着手持物、送礼等行为接入,业务层开始出现越来越多“如果是其他玩家,就额外处理一下”的代码。
这次调整主要做了两件事:根据 Animator 的实际驱动方式拆分实现;让角色实体以普通 C# 对象的方式持有动画驱动器,负责它的创建与释放。下面保留这次重构时的思路,说明原先哪里不方便,以及新结构怎样消除这些特殊处理。
软件在真机上Crash后, 我们往往不能直接得到错误日志, 因此通常需要借助第三方工具来实现对日志的抓取和分析. 本文记录一次Unity游戏在安卓环境下频繁闪退的Debug过程, 使用Android Studio 2025.1.4.8进行日志抓取.
排查一个线上问题时,日志本应提供线索,但大量高频输出也会让问题更难看清。后来我专门做了一次统计:从进入游戏开始,采样到帧率稳定后的五秒,查看每条日志分别打印了多少次。
结果排在第一的一条输出出现了 947 次,后面的几条则是几十次。删掉这条重复日志后,当时的主观流畅度已有明显改善。这让我开始系统整理日志频率、用途和开关。
在 Unity 的 Lua 业务中调用 C#,经常会遇到一种割裂感:代码运行没有问题,编辑器却不知道对象是什么类型,也无法继续补全后面的字段。尤其经过单例、委托和 CS 表之后,一条本来有完整类型信息的调用链,很容易变成一串未知字段。
我在开源生成器上做了些修改,把这些类型提示补齐。
随着玩法增加,项目的 GM 面板里积累了越来越多按钮。最早把命令放在同一页还算方便,后来查一个不常用的操作要翻很久,添加命令也常常需要修改面板本身。
我在 2024 年 8 月做了带分类的新版本,允许业务在运行时注册命令;到 2025 年 3 月,又增加了本地收藏。改动不复杂,但它解决的是开发和测试每天都会遇到的问题。
想象一座带有桥洞的小桥. 玩家先从左侧上桥, 再从右侧下桥, 最后从中间的桥洞走过去.
这是一个很简单, 很常见的场景. 然而, 要在2D top-down视角的游戏中实现它却比想象中更复杂 –在桥上阻挡玩家跳下去的碰撞盒, 要如何才不会阻挡要穿过桥洞的玩家?
