Repository navigation
2026.1.2000
Fantasy 2026.1.2000
本次更新统一了漫游创建、断线重连与生命周期管理,新增服务端启动钩子、协议拷贝方法和服务发现 API,并修复网络连接、WebGL、协程锁及热更新相关问题。
更新范围:自 2026.1.1001 发布后,至 f0a67dd0(发布 2026.1.2000,2026-08-29),共 24 条提交:18 条非合并提交(含 1 条版本发布提交)、6 条合并记录。
新增与改进
- 服务端启动钩子:新增
IEntryInitializeHook,支持在配置加载完成、Scene 创建之前自动发现并执行自定义启动逻辑,可用于配置校验、数据库连接检查和外部服务验证。 - 协议拷贝方法:C# 协议导出自动生成
DeepCopy()和CopyTo(ref ...)方法,便于在业务中复制协议对象。相关贡献:PR #203。 - 服务发现 API:开放
ServiceDiscovery.SelectOne、SelectByHash、GetAddress,新增GetAllAddress,方便业务自行选择服务实例及获取地址集合。相关问题:#206。 - 漫游创建与重连统一:通过
GetOrCreateRoaming获取或创建漫游上下文,统一 Session 绑定、重连恢复与延迟销毁流程;保留可配置的重连窗口,默认 3 分钟。 - 漫游连接与生命周期整理:统一由
Link建立或恢复目标端连接,完善关闭、解绑及 Terminus 清理流程;新增ErrRoamingOwnerChanged,用于标识来自失效漫游上下文的控制请求。
问题修复
漫游与场景
- 修复客户端重连后,旧 Session 的延迟清理任务误删新 Session 漫游组件的问题,避免由此引发的异常断线与空引用错误。相关贡献:PR #198。
- 使用 Session 与漫游上下文的 RuntimeId 校验生命周期请求,防止旧 Gate 的延迟暂停、解绑或销毁请求影响新 Gate 已接管的 Terminus。
- 修复同一 Root Scene 下的 SubScene 之间漫游传送后,第二次传送失败的问题;各 SubScene 独立管理 Roaming 与 Terminus,并在关闭时完成相应清理。
- 修复同一 Process 内漫游传送后,其他服务器无法正常发送漫游消息的问题;恢复目标端漫游消息锁,并在旧路由失效时返回路由错误,供发送端重新查询。
- 修复 Scene 创建期间线程上下文不正确导致的 WebSocket 异常,补齐 Scene/SubScene 初始化及服务发现异步操作后的 Scene 线程切换。
网络与客户端
- 修复
HTTPServerNetwork销毁时可能阻塞的问题,支持异步停止与释放,并接入 Scene 关闭流程。 - 修复 WebSocket 服务端连接断开后,底层 TCP 连接未正确关闭的问题,完善接入失败及连接销毁时的资源释放。相关问题:#207。
- 补齐客户端 RPC 响应完成回调的异常捕获与日志输出,覆盖普通和 Debug 消息调度器。相关问题:#212。
Unity 与 WebGL
- 修复启用
FANTASY_WEBGL时替换 Unity 编辑器主线程SynchronizationContext,导致编译管线出现InvalidCastException的问题。相关问题:#204。 - 修复 WebGL 构建中
Runtime.Connect()或Scene.Create()一直等待、无法返回的问题,统一使用主线程调度器的同步上下文。 - 完善 Unity 编辑器配置对象加载失败时的默认实例回退,以及程序集自动拷贝入口的空值检查,避免启动时因配置对象不可用而报错。
运行时与热更新
- 修复协程锁超时后只记录日志、未释放锁的问题;超时从成功持锁时开始计时,超时后自动释放,并避免随后
Dispose()重复释放。相关贡献:PR #200。 - 修复 Default ID 模式下,World ID 大于 255 时被强制转换为
byte而静默截断的问题;相关 World ID 传递及World.Id改为使用uint。相关问题:#205。 - 修复热更新程序集清单无法替换的问题;注销时可校验程序集实例,防止旧程序集卸载时误删新清单,并同步更新 SourceGenerator 生成的卸载逻辑。相关贡献:PR #215。
升级注意事项
本次包含不兼容的漫游 API 与内部协议变更,使用漫游功能的项目请先完成调用迁移。
| 原有调用 | 迁移方式 |
|---|---|
session.CreateRoaming(...)、session.TryCreateRoaming(...) |
改用 await session.GetOrCreateRoaming(roamingId, delayRemove);返回值为漫游上下文,不再返回首次创建/重连状态。 |
roaming.ReLink(...) |
改用 roaming.Link(targetSceneAddress, forwardSessionAddress, roamingType, args),由目标端自动处理首次创建或恢复。 |
roaming.Link(session, sceneConfig, roamingType, args) |
改用地址参数重载,例如 roaming.Link(sceneConfig.Address, session.RuntimeId, roamingType, args)。 |
SessionRoamingComponent.Disconnect() |
移除整个漫游上下文时,改用 await session.RemoveRoaming(),或 await scene.RemoveRoaming(roamingId)。 |
- 保持稳定的漫游身份:重连前后应使用相同的
roamingId。delayRemove的单位为毫秒,小于等于 0 时立即销毁。目标端事件中的CreateTerminusType.ReLink仍保留,不等同于已删除的源端ReLink()方法。 - 统一升级漫游服务端节点:内部漫游请求调整了字段布局并增加归属校验。请同步升级 Gate 与参与漫游的后端服务,避免新旧版本混用。
- 检查 World ID 类型:如业务代码将
World.Id保存为byte,需要同步调整。WorldID 模式仍保留原有的 8 位 World ID 限制,本次并未扩大该模式的编码范围。 - 检查协程锁超时设置:超时现在会释放锁,但不会取消仍在执行的业务逻辑。请核对长耗时操作的
timeOut设置,避免超时后业务继续运行而失去互斥保护。 - 更新生成产物:使用新增协议拷贝方法前,请通过新版协议导出工具重新生成代码;更新框架及 SourceGenerator 后,请重新编译热更新程序集,以使用新的卸载逻辑。
文档与示例
- 新增 Entry 初始化钩子使用指南 及启动示例。
- 更新 Roaming 框架文档,同步调整登录、重连和 Terminus 清理示例。
- 更新仓库内
fantasy-netSkill 的启动钩子说明、漫游使用方式与检查清单。
工具与发布
- 将 Fantasy.Net、Fantasy.Cli、Fantasy.Unity 及协议工具的相关版本标识更新为
2026.1.2000。 - 更新仓库内的 Fantasy-Net、Fantasy.Cli NuGet 包,以及 Unity SourceGenerator 和协议导出工具的二进制文件。
贡献者
感谢 @shazhongcheng、@WuTangKel、@AmaniDawn 的贡献。
完整提交记录
展开查看全部 24 条提交(含 6 条合并记录)
以下保留原始提交标题,按 Git 历史顺序从旧到新列出;日期采用提交的作者日期。
| 日期 | 提交 | 作者 | 原始提交标题 |
|---|---|---|---|
| 2026-07-22 | f7fe350c | qq362946 | 修复了HTTPServerNetwork 再销毁的时候,有可能卡主的问题 |
| 2026-07-25 | 651f2813 | qq362946 | 修复了 Scene 在创建的时候,WebSocket因为可能在错误的线程下导致的问题。 |
| 2026-07-29 | 3cd1de04 | qq362946 | 新增 IEntryInitializeHook 接口 |
| 2026-07-30 | 0c301152 | shazhongcheng | 修复重连后旧 Session 延迟删除新 Roaming 组件 |
| 2026-08-08 | 96259cb9 | WuTangKel | fix: 协程锁超时后自动释放 |
| 2026-08-08 | 6df3507b | qq362946 | Merge pull request #200 from WuTangKel/fix/coroutine-lock-timeout-not-release |
| 2026-08-12 | 830c6ef4 | Amani | 增加协议生成时候,自动生成深拷贝方法,便于开发时候的深拷贝操作 |
| 2026-08-17 | 2a5d62a4 | qq362946 | Merge pull request #198 from shazhongcheng/修复session延迟删除bug |
| 2026-08-17 | 493d5d4d | qq362946 | Merge pull request #203 from AmaniDawn/main |
| 2026-08-17 | 2cc61137 | qq362946 | 优化RoamingComponent 的代码 |
| 2026-08-17 | 182b3e7e | qq362946 | Merge branch 'main' of https://github.com/qq362946/Fantasy |
| 2026-08-20 | f38cb73f | qq362946 | 统一漫游创建、重连与生命周期管理 |
| 2026-08-20 | c1bf22ed | qq362946 | 修复了漫游传送后,如果 subScene 在同一个 Scene 会出现第二次传送失败的问题 |
| 2026-08-20 | 7b1a4c58 | qq362946 | 修复了漫游传送后,如果在同一个 Process 的时候,其他服务器无法正常发送漫游消息的问题 |
| 2026-08-20 | 2d13b36b | qq362946 | 根据 #204 修复FANTASY_WEBGL 在编辑器替换主线程 SynchronizationContext,编译管线 InvalidCastException |
| 2026-08-20 | da30b498 | qq362946 | 根据 #207 修复WebSocket 服务端连接断开后底层 TCP 未关闭 |
| 2026-08-20 | e07b7fc1 | qq362946 | 修复 WebGL Build,Runtime.Connect() 或 Scene.Create() 永远不返回的问题 |
| 2026-08-20 | 5f5282c4 | qq362946 | 根据 #205 修复Default idFactory 文档允许 World ID > 255,运行时却 (byte) 静默截断的问题 |
| 2026-08-20 | 9c7f2695 | qq362946 | 根据 #206 暴露更多的服务发现 API,目前能暴露都暴露都出来。 |
| 2026-08-24 | f980109d | shazhongcheng | 修复热更新程序集清单无法替换问题 |
| 2026-08-29 | 7afefead | qq362946 | Merge pull request #215 from shazhongcheng/修复热更程序集替换问题 |
| 2026-08-29 | 245f9739 | qq362946 | 修复 #212 |
| 2026-08-29 | 7e712587 | qq362946 | Merge branch 'main' of https://github.com/qq362946/Fantasy |
| 2026-08-29 | f0a67dd0 | qq362946 | 发布 2026.1.2000 |