Welcome to HanWen's Blog!

The language switcher is available in the top navigation

我把延时摄影中反复手动完成的操作,做成了一套以 TimelapseManager 为入口的自动化工具流:配置好相机、依赖和拍摄时段后,创建任务就能自动拍摄包围曝光序列、下载照片、合成 HDR、去闪并导出视频。开启晚霞评分后,它还会找出霞光片段、给相册评分,并通过企业微信推送结果。

Timelapse Manager 运行总览,集中显示任务状态、当前阶段和受控进程
阅读全文 »

公司的社交游戏有一套双人牵手玩法,由我负责 3C 方面的开发。发起方控制移动,接收方跟随;两名角色需要适应地形、保持手部接触,并与游戏中的个人动作和操作玩法配合。下面从能实现基本表现的跟随与握手设计讲起,结合调试过程和体验反馈,逐步说明旋转位移、手部姿态和网络同步的改进。

双人牵手联调画面,左侧为接收方,右侧为发起方

阅读全文 »

2024 年底,我做了一个很小的 Unity 自动点击工具。原因也很简单:每次进游戏都要等待场景加载,再依次点几个连接、登录和进入游戏的按钮。这段流程大约持续半分钟,操作不复杂,却要一直盯着。

工具后来尝试过 UI 导航图,现在的 0.3.4 则把流程交给可编译的 C# 业务脚本:AI 根据项目源码和运行时证据准备代码,Unity 编译并执行,脚本自己说明从哪里开始、做哪些动作,以及用什么结果判断成功。日常重复自测时,我直接运行已有脚本。

隔离演示工程中 Unity Autorun Tool 0.3.4 的 Autorun Scripts 主面板

阅读全文 »

这两天用Tuanjie开发项目, 挂机一段时间之后电脑总是莫名其妙的卡死(通常是第二天上班发现),没蓝屏,也没有稳定的报错弹窗, 只偶尔会有几个应用程序报错提示OOM, 一旦出现基本只能长按电源键重启。

最后排查出是 Tuanjie 内存泄漏,Unity 6 也存在。但通过一些特殊途径可能更高频地触发内存泄漏,导致卡死,在此记录一下排查的过程。

tuanjielogo

阅读全文 »

做图鉴和排行榜展示时,我需要把角色与手持模型放进一个固定大小的展示空间。不同服装、不同形状的手持物可以组成很多种组合,逐个配置缩放很难维护,所以我根据模型的包围盒自动限制整体尺寸。

随后遇到了一个奇怪的问题:有的角色会被缩得非常小,看起来像是展示空间里只剩一个小点。缩放公式没有明显错误,真正出问题的是公式拿到的“模型尺寸”。

阅读全文 »

项目里的 Timeline 越来越多之后,主场景也跟着引用了越来越多的动画和表现资源。美术制作时,把 Timeline 挂到场景中的 PlayableDirector 上很方便;但如果把这份引用关系一直保留到运行时,场景就会持续携带这些资源依赖。

这次调整把 Timeline 资源与场景对象的绑定信息单独保存,需要播放时再加载并恢复绑定。美术仍然在场景中制作和预览,交付时多一个导出步骤,运行时则按实际需要装配。

阅读全文 »

最近公司上线了一个休闲小游戏, 我操刀了游戏的动画部分, 也在项目里摸索出了一套基础但可用的动作同步方案. 它基于广播状态实现同步, 原理并不复杂. 但所谓适合的才是最好的 —-它对大多数非延迟敏感的小游戏来说都已经够用, 且能在不依赖三方插件的情况下快速搭建, 因此还是想分享一下构建它的思路.

Mecanim 透传状态图与过渡设置拼图
阅读全文 »

配置表有了类型定义之后,业务代码里仍然可能散落着很多数字 ID。读代码时需要回到表格查含义,复制到另一处时也容易写错。手工维护一份常量文件能够改善可读性,但会增加一份需要同步的数据。

我从 2025 年 9 月开始扩展项目的导表流程,让道具 ID 随导表一起生成。到 2026 年初,实体、界面、音效等类型也有类似需求,于是又把重复的输出流程抽成公共生成器,并继续接入 NPC ID。

阅读全文 »

前两天发现一个邪门的事情:GameFramework 的 GameEntry.Resource.LoadAssetAsync<T> 加载 Sprite 时,文件明明存在,却报了类型不匹配:

1
2
3
Exception: GameFrameworkException: Load asset
'Assets/Res/UI/UISprite/EnterGamePopup/Achievement/EGP_Achievement_Base_ChineseTraditional.png'
failure load type is UnityEngine.Texture2D but asset type is UnityEngine.Sprite.
阅读全文 »
0%