Read Text (OCR)(读取文本)
读取屏幕上的动态值,让后续节点按它们分支、把它们打回去,或按它们点击。
用途
从一个或多个矩形读取文字——坐标、金币、计时、状态词——并写入变量。
你告诉它区域含什么(What to read 类型),它自动调优 OCR 引擎并产出正确类型的变量。你不配置引擎;你描述内容。
何时用
- 读要比较的数字——金币、负载、槽位数。
- 提取坐标供后续节点按它动作。
- 读状态词来分支。
- 读
3/5之类计数器或04:20计时。
何时不用
- 找按钮或图标——用 Find Image。OCR 对图形更慢更不可靠。
- 检测无文字的状态——用 Check Region。
- 检查文字是否存在——读它,再用带 Is Empty 的 If。
前提
两样,缺则节点 Fatal:
- OCR 引擎和语言必须可用。
- 流程的
ocrEnabled功能开关必须开。
Read Text 节点立刻失败且无输出?调试区域之前先查流程设置里的 features.ocrEnabled。这是最常见的成因。
如何运行
设置
| 设置 | 类型 | 范围 | 默认 | 作用 |
|---|---|---|---|---|
| Region | 矩形 | 屏幕百分比 | — | 要读的区域 |
| What to read (Type) | 选择 | auto、text、number、counter、time、percentage、custom | auto | 调优 OCR 并决定输出变量 |
| Read multiple regions | boolean | — | false | 在一个节点里读多个区域 |
| Regions | 列表 | ≤ 20 | — | 多区域条目,各有自己的变量、类型和清洗 |
| Outputs | 列表 | 每区域 ≤ 8 | — | 命名输出 → 变量,带可选 Default |
| Pattern | string | ≤ 500 字符 | — | Custom 类型:命名组正则 |
| Auto convert | boolean | — | — | 逐捕获组推断 int/float/bool |
| Character whitelist | string | ≤ 200 字符 | — | 引擎只识别这些字符 |
| Post-process | 列表 | ≤ 16 步 | — | 有序清洗:raw、digits、whitelist、regexFilter |
| Language | string | ≤ 32 字符 | Auto | OCR 语言;空 = 配置的默认 |
| Timeout | integer | 1–120000 ms | 5000 | 尝试取新文字多久 |
| Poll interval | integer | 50–120000 ms | 250 | 多久重抓一次 |
内容类型
最重要的设置。选对类型胜过任何手动调优。
| 类型 | 产出 | 用于 |
|---|---|---|
auto | 原始文本 | 真不知道时 |
text | 字符串 | 状态词、名字 |
number | 一个数 | 金币、负载、任何要比较的值 |
counter | <名>_current 和 <名>_max | 3/5 式计数器 |
time | <名>_hours 和 <名>_minutes | 04:20 计时 |
percentage | 一个数 | 85% |
custom | 每命名正则组一个变量 | 坐标之类结构化文本 |
Auto 返回原始文本。原始字符串 "1167" 不是数字,所以 {{gold}} > 100 会悄悄失败。选 Number 让比较生效。
自定义正则提取
custom 类型取一个带命名组的正则并每组产出一个变量:
Pattern: X:(?P<x>\d+)\s+Y:(?P<y>\d+)
屏幕: X:1167 Y:1120
结果: x = 1167 y = 1120 (数字)
模式必须含至少一个命名组 (?P<name>…)。无效或无组的模式让节点在任何抓取之前 Fatal——它不会悄悄提取出空。
解析不出就留空
解析不出的 Number 或 Counter 写空,不是 0。
刻意如此:捏造的 0 会悄悄流进比较、做出错误决策;空值则显形。要具体回退就给逐输出 Default。
因此,把绑 OCR 的变量声明为可空——number?,不是 number。
多区域读取
一个节点、多个矩形、各写各的变量。当你需要一屏上两三个相关值时用它——一个节点里读取意味着一张截图,不是三张。
每个区域带自己的类型、清洗和默认值,所以只含数字的价格能挨着文字标签。
只有扁平变量
结构化类型写扁平名(slot_current,不是 slot.current)。因为 {{name}} 引用按扁平名解析——嵌套对象在 If 里能用,但作 Click 坐标会失败。
端口
| 端口 | 走它的时机 | 必接 |
|---|---|---|
| Success | 读取完成——包括空区域。 无文字不是失败 | 否 |
| Failure | 超时内无新帧,或 Custom 模式无匹配 | 否 |
| Cancelled | 读取中途运行被停 | 否——永不被走 |
| Fatal | OCR 引擎缺失、无语言、区域无效、Custom 正则或后处理无效 | 否——永不被走 |
普通读取即便没找到文字也成功。Failure 意味着没抓到帧,或 Custom 模式无匹配。要按空文字分支,读它再用带 Is Empty 的 If。
基础示例
读金币计数:
- Region:数字周围的紧矩形
- What to read:Number
- 变量:
gold
然后 {{gold}} > 1000 作为数值比较生效。
实际示例——读坐标再决定
一次 OCR 把屏幕标签变成两个驱动真实决策的数值变量。
高级示例——多区域容量检查
在一个节点里读两个槽位计数,队列满就停:
- Read multiple regions:开
- 区域 1 →
slot_1,类型 Counter → 产出slot_1_current、slot_1_max - 区域 2 →
slot_2,类型 Counter → 产出slot_2_current