☰
原神小助手实战:图像识别就能跑自动战斗与刷本,一文读懂 genshin_impact_assistant 代码
2026/10/21 10:36:59 网站建设 项目流程

原神小助手实战:图像识别就能跑自动战斗与刷本,一文读懂 genshin_impact_assistant 代码

【免费下载链接】genshin_impact_assistant原神小助手 Genshin Assistant (CN/EN) | 自动战斗,秘境,领日常,半自动委托项目地址: https://gitcode.com/GitHub_Trending/ge/genshin_impact_assistant

每天手动做委托、刷秘境、跑采集路线的人很多。genshin_impact_assistant(原神小助手)用图像识别加模拟按键解决这件事:自动战斗、自动刷秘境、大世界采集、领日常,你只负责选队伍。下面按"我读完源码后的思路"讲三个最核心的机制。

📦 项目速览

一句话定位:基于图像识别(模板匹配 + OCR + YOLO 目标检测)与键盘鼠标模拟的原神辅助工具,不涉及内存读写等违规操作,功能边界集中在战斗、秘境、采集、委托、领奖这几类日常。

项目内容
技术栈Python 3.7、OpenCV、torch 1.13.1(YOLO)、pponnxcr(OCR)、pywebio 网页 UI、loguru、A* 寻路
适用人群想跑日常自动化的玩家;想学"视觉 + 模拟输入"方案的技术读者
核心价值任务化封装(Mission 框架)+ 流程状态机,写一个新采集任务只需继承Mission
仓库git clone https://gitcode.com/GitHub_Trending/ge/genshin_impact_assistant

适合谁 / 不适合谁:适合想在本地 Windows 上跑稳定日常、愿意调参的玩家;不适合想要云端多开、手机投屏之外的复杂设备方案,也不适合期望"零配置全自动"的用户——战斗队伍、采集路线都要自己配。

🔍 核心机制拆解

1. Flow 状态机:多步长任务怎么保证"不卡死"

要解决的问题:一个采集任务要串起"移动→战斗→拾取→回路线"多个长耗时步骤,任何一步超时或异常都会让任务静默卡死。

设计思路:source/flow/ 把每一步抽象成FlowTemplate,内部是一个六段状态机(INIT→BEFORE→IN→AFTER→END→OVER,定义在 flow_code.py)。enter_flow()每轮被调用一次,按状态前进;状态推进到END时返回next_flow_id,控制器据此切换流程;同时挂一个TimeoutTimer,超时也强制切换。流程结束后由EndFlowTemplate返回错误码(如ERR_STUCK),上层统一处置。

elif self.rfc == FC.END: self.state_end() self.rfc = FC.INIT logger.info(f"Flow Switch To: {self.next_flow_id}") return self.next_flow_id if self.flow_timeout.istimeout(): self._before_timeout() return self.next_flow_id

这段在干什么:走完状态机就返回"下一个流程 ID",相当于把控制流交还给调度器;超时则直接跳走。效果是每步都有兜底,任务最坏情况是"超时换流程",而不是永远等下去。

2. 协作式线程:暂停和停止都不杀线程

要解决的问题:游戏辅助的线程里正按着键盘,直接kill会留下按键残留和游戏状态错乱。

设计思路:base_threading.py 的BaseThreading用两个标记位pause_threading_flag/stop_threading_flag做协作式控制,线程自己在checkup_stop_func()处检查并退出循环;子线程通过sub_threading_list级联暂停——父线程一暂停,战斗、拾取等所有子线程跟着停。

def pause_threading(self): if self.pause_threading_flag != True: logger.debug(f"{self.name} pause threading") for thread_obj in self.sub_threading_list: thread_obj.pause_threading() self.pause_threading_flag = True

这个循环把暂停信号沿线程树向下传,一层不落。配合checkup_stop_func()(循环里if ...: break的写法),任务随时可暂停/恢复/终止,且不会留下"按住的 W"这种脏状态。task_manager.py 里TaskManager本身就是BaseThreading的一个实例,整个任务列表就是它的一个"长任务"。

3. 导航与操作层:A* 走点 + 焦点窗口守卫

要解决的问题:大世界移动需要"从哪传送到哪、沿哪条路走";同时模拟操作最怕你在别的应用上,它按错窗口。

设计思路:寻路侧,tianli_navigator.py 继承 A*,节点不是地图网格,而是人工整理的导航点图(tianli_navigation_points_test.json 里存每个点的坐标和links),代价用经纬度近似球面距离:

x = (longB - longA) * math.cos((latA + latB) / 2) y = latB - latA return math.hypot(x, y)

把经纬度差值乘上纬度修正再开方,就是常见的局部平面近似——足够在导航点图上算出最短路径,比逐格 A* 快得多,且路径天然贴着可行走路线。

操作侧,interaction_core.py 给所有操作套了个before_operation装饰器,先查焦点窗口:

winname = get_active_window_process_name() if winname not in PROCESS_NAME: while 1: if get_active_window_process_name() in PROCESS_NAME: break time.sleep(5 - (time.time() % 5)) return func(*args, **kwargs)

焦点不在原神窗口(进程名匹配 "Genshin Impact" / "原神")就原地等,等到切回来才执行——这一招挺实用,跑任务时你可以继续用电脑,不用担心它点错地方。截图还带缓存:RECAPTURE_LIMIT = 0.5,0.5 秒内的重复截图直接复用上一帧,省掉大量 GDI 抓取。

💡 代码里的小巧思

  • 异常自带"可能原因":GIABaseException有个POSSIBLE_REASONS类属性,task_excepthook捕获后逐条打印红色提示;SnapshotException被捕获时自动把四通道截图存成 jpg 到Logs/,复现问题不用人肉截图(见 source/exceptions/)。
  • 任务懒加载:TaskManager.start_stop_task()里每个if task_name == ...分支内才import对应任务类,启动时不必把所有任务模块全拉进内存。
  • OCR 结果分级处理:Ocr.ocr_single_line走pre_process → ocr → after_process → format_result四段管道,每步改写都会logger.debug出"前 → 后",调识别问题时能直接看到是哪一步把 "UID12345" 截成了 "UID"。
  • 战斗寻敌的退避计时器:AimOperator三级找敌(锁定血条→原地转圈→移动寻找),aim_timeout_retry_timer = AdvanceTimer(6)让失败后 6 秒内不再重复寻找,避免无意义的忙转;移动寻敌前还会用ThreadBlockingRequest向换人线程发阻塞申请,先让对方暂停战术执行。
  • Mission 函数命名约定:reg*是条件触发、set*是开关、handle*是错误处置;初始化参数is_CFCF/is_TMCF/is_PUO/is_CCT分别声明是否启用采集/移动/拾取/战斗模块,框架据此自动装配,写新任务不用手动 new 这些组件。

🚀 上手与落地

  1. 克隆后在 Windows 上装依赖:pip install -r requirements.txt(requirements.txt 锁了 torch==1.13.1、numpy==1.21.6 等老版本,建议按 README 装 Python 3.7 或按文档说明的版本)。
  2. 游戏窗口设为1920x1080(InteractionBGD按这个尺寸工作),通过python genshin_assistant.py或console.bat启动:进程会起 pywebio 服务监听22268端口,再用 pywebview 弹出 1600x900 的窗口指向它,页面注册在 webio.py(主页、战斗设置、Mission 页、路径编辑等)。
  3. 配置落在config/settings/,由 General.jsontemplate 生成,常用项:CorrDegree(匹配阈值 0.95)、InteractionMode(Desktop前台 /DesktopBackground后台 DM 模式)、CaptureMode。
  4. 任务选型:日常领奖选ClaimRewardTask,刷本选DomainTask,跑自定义路线用MissionTask并选一个Mission*.py;写自己的路线时继承 source/mission/mission.py,move_straight/move_along是阻塞式、start_combat是持续式、pickup_once是一次式,组合起来就是完整任务。
  5. 限流与配额层面,这个项目的"配额"是游戏内节奏:用flow_timeout_time(如CollectionCombat给 300 秒)给每个流程设上限,卡住就走错误码分支,而不是无限重试。

⚠️ 局限与演进

  • 依赖锁了 torch 1.13.1、numpy 1.21.6、Python 3.7 时代的环境,装新环境会比较折腾;pywin32/win32api也说明桌面版基本只跑 Windows,移动设备侧虽有 adb/uiautomator2 支持但路径不占主导。
  • 委托模块官方标注"仅部分委托",commissions/ 下只有 10 个具体委托脚本,版本更新后委托内容变化可能需要补脚本。
  • 仓库内文档偏少,说明主要放在外部文档站;视觉素材(按钮、图标)没有回归测试机制,游戏 UI 一改容易批量失效。

可演进方向:一是把 OCR/YOLO 依赖升级到新版并做量化,压缩首启的模型加载时间(现在listening.py里giaocr/giayolo.install_gia_dependence每次启动都要校验安装);二是把 Flow 状态机从业务代码里抽成独立小包,配合快照单测(SnapshotException的截图能力正好能当视觉回归的素材来源),让 UI 改版的影响面可量化。

结语

游戏辅助工具的生命周期跟版本更新强相关,而 genshin_impact_assistant 把"识别—决策—操作"拆成可替换的层,社区才能持续跟上版本节奏——这种工程拆分,比任何单个自动功能都更值得借鉴。

【免费下载链接】genshin_impact_assistant原神小助手 Genshin Assistant (CN/EN) | 自动战斗,秘境,领日常,半自动委托项目地址: https://gitcode.com/GitHub_Trending/ge/genshin_impact_assistant

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询