TH1/MD/CrashSight_2026-06-05_0.7.2c_1day/blocking/009_maprenderer-highlight-keynotfound.md

5.5 KiB
Raw Blame History

移动攻击高亮字典 Key 缺失

  • 分类blocking
  • Issue 数1
  • 0.7.2c 最近一天次数1
  • 设备数合计1
  • 报告生成2026-06-05 12:00:37

Issue

Issue 类型 次数 设备 最近上报 消息
0bbff28f08b867749349762f2e47eac2 KeyNotFoundException 1 1 2026-06-05 10:54:12 The given key '1986' was not present in the dictionary.

设备上下文

0bbff28f08b867749349762f2e47eac2

  • 样本 CrashId7ad7856bc6e64f8d824b7f9017c505c7
  • 样本 DeviceId00-24-01-f5-1f-01
  • CrashSight 附带日志文件:False

最终上报内容:

KeyNotFoundException
The given key '1149' was not present in the dictionary.
fj.bgn (System.UInt32 a) (at <00000000000000000000000000000000>.0)
gi.bla (cfo a, bsr b) (at <00000000000000000000000000000000>.0)
TH1_Presentation.Sequencer.Task.InputSequencerTask.fvd (System.Action a) (at <00000000000000000000000000000000>.0)
erl.fcy () (at <00000000000000000000000000000000>.0)
cvl.ggk () (at <00000000000000000000000000000000>.0)
TH1_Logic.Core.Main.Update () (at <00000000000000000000000000000000>.0)

fj.bgn (System.UInt32 a) (at <00000000000000000000000000000000>.0)
gi.bla (cfo a, bsr b) (at <00000000000000000000000000000000>.0)
TH1_Presentation.Sequencer.Task.InputSequencerTask.fvd (System.Action a) (at <00000000000000000000000000000000>.0)
erl.fcy () (at <00000000000000000000000000000000>.0)
cvl.ggk () (at <00000000000000000000000000000000>.0)
TH1_Logic.Core.Main.Update () (at <00000000000000000000000000000000>.0)

fj.bgn (System.UInt32 a) (at <00000000000000000000000000000000>.0)
gi.bla (cfo a, bsr b) (at <00000000000000000000000000000000>.0)
TH1_Presentation.Sequencer.Task.InputSequencerTask.fvd (System.Action a) (at <00000000000000000000000000000000>.0)
erl.fcy () (at <00000000000000000000000000000000>.0)
cvl.ggk () (at <00000000000000000000000000000000>.0)
TH1_Logic.Core.Main.Update () (at <00000000000000000000000000000000>.0)

KeyNotFoundException
The given key '1149' was not present in the dictionary.
fj.bgn (System.UInt32 a) (at <00000000000000000000000000000000>.0)
gi.bla (cfo a, bsr b) (at <00000000000000000000000000000000>.0)
TH1_Presentation.Sequencer.Task.InputSequencerTask.fvd (System.Action a) (at <00000000000000000000000000000000>.0)
erl.fcy () (at <00000000000000000000000000000000>.0)
cvl.ggk () (at <00000000000000000000000000000000>.0)
TH1_Logic.Core.Main.Update () (at <00000000000000000000000000000000>.0)

同设备最近 ERROR 上报序列:

时间 Issue 类型 消息
2026-06-05 11:00:27 10d4df507992c1a66a90693df20b21c3
2026-06-05 10:54:22 76c4c1b1a5add246455aec813c46d59a
2026-06-05 10:54:18 bb81bce180d8672f500aa9f2021ec9f8
2026-06-05 10:54:15 10d4df507992c1a66a90693df20b21c3
2026-06-05 10:54:12 0bbff28f08b867749349762f2e47eac2
2026-06-05 10:54:11 b9356ab138b2b54e96f3db7887c3b8d0
2026-06-05 10:54:06 bb81bce180d8672f500aa9f2021ec9f8
2026-06-05 10:54:02 10d4df507992c1a66a90693df20b21c3

代码位置

  • Unity/Assets/Scripts\TH1_Renderer\MapRenderer.cs:594: public bool SetUnitAllMoveAttackTargetHighlight(uint uid) //渲染所有可移动位置的高亮,其中可以攻击的位置要标红,如果是自己人或者敌人在移动范围内但是不在攻击范围内,则不能高亮
  • Unity/Assets/Scripts\TH1_Logic\Map\MapInteraction.cs:269: MapRenderer.Instance.SetUnitAllMoveAttackTargetHighlight(unitData.Id);
  • Unity/Assets/Scripts\TH1_Logic\Skill\AllSkill\InfiltrateSkill.cs:140: // 依赖 CalcUnitMoveInfo 已对 self 计算过(玩家点击路径由 SetUnitAllMoveAttackTargetHighlight 保证;
  • Unity/Assets/Scripts\TH1_Renderer\MapRenderer.cs:642: ROGridMap[targetGridData.Id].SetMoveHighlight(true);
  • Unity/Assets/Scripts\TH1_Renderer\MapRenderer.cs:678: ROGridMap[targetGridData.Id].SetAttackHighlight(true);
  • Unity/Assets/Scripts\TH1_Renderer\MapRenderer.cs:686: ROGridMap[targetGridData.Id].SetMoveHighlight(true);

解码结论

解码栈直接是 TH1Renderer.MapRenderer.SetUnitAllMoveAttackTargetHighlight -> Dictionary<uint, ...>.get_Item,缺失 key 为 1986。与 007_map-click-move-keynotfound 相同,根因是移动/攻击高亮计算得到的 targetGridData.Id 没有对应 ROGridMap 渲染项;本 Issue 不是定时器包装,而是点击/选择单位后立即刷新高亮时直接抛出的 KeyNotFound。

可疑源码点是 ROGridMap[targetGridData.Id] 的直接索引访问,以及 targetGridDataList 可能来自逻辑地图但未保证所有格子都有 renderer。和 007 合并时应按“MapRenderer 高亮字典 key 缺失”处理,但保留两个报告可以区分触发入口:一个是移动后的延迟复点,一个是选择/刷新高亮的直接入口。

判断

这是阻断类,因为 CrashSight 行或 LogError 包装内容中存在真实异常类型、异常对象或调用栈;不是单纯业务状态诊断。 本批样本 hasLogFile=falseAPI 能拿到的是最终上报内容和同设备 ERROR 上报序列,不包含完整 Unity 运行日志;根因上下文按可见上报链路记录。

建议

优先按次数最高的 Issue 样本复现并修复;若同设备上报序列中出现更早的异常,应以更早异常作为源头处理。