回答
你遇到的“只能标记15个键”问题,主要与原神的游戏渲染机制和Hamibot的图像识别原理有关。原神使用Unity引擎开发,界面元素并非标准Android控件,而是通过OpenGL直接绘制在屏幕上。Hamibot在自动化游戏时,无法使用常规UI选择器,只能依赖图像匹配(images.findImage/images.matchTemplate)或颜色定位(images.findColor)来识别按键。
出现标记数量上限的常见原因:
- 识别阈值过滤:多个按键外观相似、背景复杂或存在半透明遮罩时,算法会因置信度低于设定阈值而自动丢弃部分结果。
- 单帧性能保护:Hamibot在单帧内同时执行过多图像匹配任务时,会触发性能保护机制,优先返回置信度最高的前N个结果(通常为15个左右),其余被跳过。
- 动态状态干扰:原神按键存在冷却、高亮、禁用等状态变化,若仅使用单一静态模板,部分状态下的按键特征点无法匹配。
- UI层级重叠:技能图标、提示文字、特效粒子可能覆盖在按键上方,导致模板匹配失败。
优化方案与最佳实践:
- 分区域串行识别:将屏幕划分为多个矩形区域,按区域依次调用识别函数,避免单帧并发过高。
- 多模板+动态阈值:为每个按键准备正常、冷却、高亮等多套模板,使用
images.matchTemplate配合threshold参数动态调整匹配严格度。 - 坐标预设+图像校验:对位置固定的按键,直接记录坐标范围,运行时仅用图像识别校验当前状态(如是否冷却),大幅降低识别负载。
- 降低识别频率:在循环中加入
sleep(200)~sleep(500),避免CPU占用过高导致丢帧或识别中断。 - 关闭游戏内干扰项:在原神设置中关闭动态模糊、降低UI特效、隐藏非必要提示,可显著提升特征提取成功率。
示例代码结构(Rhino 1.7.15 兼容):
// 文档地址 https://docs.hamibot.com/
var screen = captureScreen();
var template = images.read("/sdcard/key_normal.png");
var result = images.matchTemplate(screen, template, { threshold: 0.75, max: 1 });
if (result && result.points.length > 0) {
var point = result.points[0];
// 执行点击或状态判断
}
template.recycle();
screen.recycle();
若需稳定覆盖全部21个按键,建议采用“固定坐标映射 + 图像状态校验”的混合架构。提供你当前的识别逻辑或截图区域划分方式,我可以协助调整匹配策略与参数配置。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实