保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。 保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。 验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。 包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
6.9 KiB
C3d 资料缓存:用户澄清与实施记录
2026-09-30。依据原ZCode第五轮范围性审核,以及用户本轮明确确认:“暂不改变其对外行为和接入远端查询”。此为原C3c已审子范围的实施检查点编号,不新增审核轮次。
开工裁决与精确边界
- GetPlayLv的“不动”指保持修改前外部行为、暂不接远端等级查询;允许同一文件内最小解耦取值。本人已认证时仍读PlayerData.lv,他人仍读现有缓存,缺值仍用内部-1判定;原level>=0成功、否则失败Task/InvalidOperationException保持。null/空ID、负数结果不顺手修正。
- GetPlayerLv恢复原PF同步缓存合同:仅查缓存、缺键1;缓存0/负数保留,null沿原Dictionary参数异常。SetPlayerLv保持原实现。
- GetPlayInfo恢复原空ID、缓存同一对象、缺项默认名占位;本人用已有认证资料同步更新并发一次事件。他人通过已有FriendRequest("SearchFriend", SearchFriendReq.PlayFabId=目标UserID)异步更新同一对象,Code>0且Info!=null才更新并发事件,空昵称保留默认名。不得把响应普通Level写入levels缓存或提前接GetPlayLv。
- SetPlayInfo(string,string,string)与ClearPlayInfos按原替换/清空规则,不发额外事件。远端填充如需私有重载,其唯一调用点为GetPlayInfo,作用是保留原async void更新顺序;不新增抽象层。HTTP失败沿CustomServerMgr日志/null,坏JSON映射读取失败日志而不发成功事件,不吞其他编程异常。
- 生产只改Client/Assets/Scripts/Services/KVUserService.cs上述方法及必要私有填充重载。测试只改ServiceHost/M2MergedGameplayTests.cs并新增C3ProfileCacheTests.cs,复用现有真实KV登录与PF类、内存HTTP/SDK哨兵;不修改PF/AGG源码或SDK夹具。
- 四项服务端能力、LeadboardData/FriendService/FriendModel/TileNewsManager/Duel/PlayerKVClient、LastLogin、首场景双闸保持原状。真实runtimeVerified不置true。无服务器修改、无正式请求、无Play/打包。
验证计划
红测先验证缓存默认值、对象引用/事件及异步资料更新差异,再改生产;对照真实PF服务缓存行为。覆盖101/102已认证场景、未命中1但GetPlayLv仍失败、本人直读不变、0/负数/null/空ID、成功及失败响应、不将SearchFriend.Level当作已取等级、重复请求/引用、替换与清空、KV相关SDK调用0。完整ServiceHost运行NON_ANDROID及ANDROID+AGG,最后只用Unity CLI Loop编译。
开工核验:原28项、31项基线及第五轮报告hash重新核对;用户澄清消除上次记录的约束冲突。当前记录先于任何本轮生产/测试修改,具体红绿结果与交付范围随后追加,未运行部分不标完成。
红测检查点
NON_ANDROID完整宿主在真实KV101已认证场景报告17项预期迁移差异(默认值、本人引用/事件、远端占位与请求/发布);退出码1。真实PF缓存/SDK对照先行通过;生产尚未修改。首败日志M2-C3d红测-NON_ANDROID.log保留。GetPlayLv当前未加载/本人直读/负数边界检查通过,后续须保持。
实施与离线回归检查点
生产仅KVUserService.cs:GetPlayerLv回到原缓存默认1;GetPlayLv独立按原本人/缓存/未知路径取值,负数和未加载仍为原失败Task,无远端等级查询。GetPlayInfo复用原占位对象/本人事件和私有async void填充方式,他人改走已存在SearchFriend并只消费昵称/头像;不写入等级缓存。SetPlayerLv、公开SetPlayInfo替换规则、ClearPlayInfos实现保持。私有填充重载只有GetPlayInfo一个调用点,承担原异步更新,不新增抽象层。
新增C3ProfileCacheTests及M2MergedGameplayTests的合成登录接入,共三组新增测试(真实PF参考、KV101、KV102)。最终NON_ANDROID与ANDROID+AGG分别24组491断言、0失败、formalRequests=0;全套原宿主用例仍执行。测试使用真实服务和内存HTTP,不能视为线上资料来源已验。
本轮遇到并处理的验证问题:
- 首次绿测HTTP500返回null时,JSON.NET对null输入抛ArgumentNullException;在该接线处沿原失败null路径返回,不发成功事件。补充空响应/坏JSON用例。首败日志保留。
- 原存档用例StorageError追到UnauthorizedAccessException;默认临时目录及工作区临时目录均复现,同代码沙箱外完整回归通过。未改存档实现、未跳断言。临时FirstChanceException诊断代码已移除,仅保留日志。
- Unity首次编译暴露真实PlayerData.lv为ObscuredInt而宿主为int,已在复制原取值表达式时显式转换int;保持原返回值语义,未改PlayerData或SDK。首次1错误/269警告证据保留。
- CLI曾因Node子进程EPERM失败,不能算编译通过;改在工具批准的沙箱外运行同一CLI。常规编译成功报告0错;一度误用Assembly-CSharp.dll检查时间,后查HotUpdate.asmdef确认该代码实际属于HotUpdate.dll,其17:44:09产物晚于最终源码17:44:01。纠正该判断,并完成已触发的强制编译和后续错误日志核对。
- 最终源文件中重复的空响应检查已清理;上述两条件491断言均在清理及显式转换后重新完整运行。Unity最终结果另附。
源码范围核对:开工2120项C#基线中仅KVUserService.cs、M2MergedGameplayTests.cs改变,新增C3ProfileCacheTests.cs,其他2118项保持。项目/SDK夹具、原PF/AGG源码、四项挂起能力和首场景双闸未改。未修改服务器、未发正式请求、未Play/付费/打包。未进行git提交或回滚既有改动。
最终验证与限定完成
- 最终ServiceHost NON_ANDROID、ANDROID+AGG各24组491断言、0失败,日志formalRequests=0;新增三组,未跳过原回归。
- Unity CLI Loop常规编译Success=true、ErrorCount=0;强制编译返回Success=null并要求取日志,该null不当作成功证明。随后get-logs按error CS[0-9]+筛选结果TotalCount=0,编辑器playing=false、compiling=false;实际HotUpdate程序集覆盖最终源码。Console总错误174条中保留已有故障验证等日志,不声称整个Console清零或真实场景通关。
- 首次Unity类型错误269条警告、HTTP失败映射异常、沙箱文件/Node进程权限失败等首败证据保留;没有隐藏失败。曾查询不支持的editor-state帮助,已改用CLI只读execute-dynamic-code确认状态;未使用UnitySkills。
- 本C3d子批的已审实现和离线/Editor验证完成。GetPlayLv仍没有新远端查询;四项服务端能力、真实首场景及跨进程保存恢复、渠道/Player和C4最终审查尚未关闭。临时冻结仍须在最终通关前恢复,命名/旧业务修正仍留整个迁移完成后另行授权。
- 不新增逐功能送审,不再将已澄清的getter边界作为阻塞。后续四项按服务端实际交付合并原C3c合同裁决与接线;本次日志和overlay只记录获审范围,不冒充整个M2完成。