[Poco][Unity] post_action 与 RPC Click 接口分析
分析 self.poco.post_action('click', self, pos_in_percentage) 的实现机制,以及如何让 UnityPoco 走 RPC Click 而非 Airtest 设备触摸。
post_action 是什么
post_action 本身不会触发点击,也不会调用任何设备/Unity 接口。它只是一个动作完成后的回调钩子,用来通知已注册的 callback。
# pocofw.py
def post_action(self, action, ui, args):
for cb in self._post_action_callbacks:
try:
cb(self, action, ui, args)
except Exception as e:
warnings.warn(...)
默认只注册了 on_post_action(空实现 pass)。可通过 add_post_action_callback() 注册自定义逻辑(日志、截图、重试等)。
参数含义:
| 参数 |
含义 |
action |
动作名,如 'click' |
ui |
当前 UIObjectProxy 对象 |
args |
动作参数,click 时是 pos_in_percentage,如 [0.5, 0.3] |
完整 click 调用链
poco("StartButton").click() 的执行顺序:
get_position() — 通过 RPC 从 Unity 侧取 UI 节点坐标(pos、size、anchorPoint)
pre_action('click', ...) — 动作前回调
poco.click(pos) — 真正点击
wait_stable() — 等待 UI 稳定(默认 0.5~0.8s)
post_action('click', ...) — 动作后回调(不执行点击)
# proxy.py
focus = focus or self._focus or 'center'
pos_in_percentage = self.get_position(focus)
self.poco.pre_action('click', self, pos_in_percentage)
ret = self.poco.click(pos_in_percentage)
self.poco.wait_stable()
self.poco.post_action('click', self, pos_in_percentage)
UnityPoco 默认点击路径(Airtest)
UnityPoco 继承 StdPoco,StdPocoAgent 默认 use_airtest_input=True:
if use_airtest_input:
inputs = AirtestInput() # 默认
else:
inputs = StdInput(self.c) # RPC
默认路径:
poco.click([x, y])
→ AirtestInput.click(x, y)
→ get_target_pos() # 百分比 → 屏幕像素
→ airtest.core.api.touch(pos)
→ G.DEVICE.touch() # Android: minitouch/maxtouch/adb
坐标来源仍走 Unity RPC(Dump / GetAttr),只是触摸注入走 Airtest 设备层。
如何走 RPC Click 接口
初始化时设置 use_airtest_input=False:
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco(
('192.168.1.100', 5001),
use_airtest_input=False, # 关键参数
)
poco("StartButton").click() # 走 RPC Click
RPC 路径:
poco.click([x, y])
→ StdInput.click(x, y)
→ RpcClient.call("Click", x, y) # TCP → Unity PocoSDK
直接用 StdPoco
from poco.drivers.std import StdPoco
from airtest.core.api import connect_device
device = connect_device('Android:///')
poco = StdPoco(5001, device, ip='192.168.1.100', use_airtest_input=False)
poco('StartButton').click()
手动调 RPC
pos = poco("StartButton").get_position()
poco.agent.rpc.call("Click", pos[0], pos[1]).wait()
StdInput 支持的 RPC 方法
| 动作 |
RPC 方法名 |
| click |
Click |
| swipe |
Swipe |
| longClick |
LongClick |
| double_click |
DoubleClick |
| rclick |
RClick |
| keyevent |
KeyEvent |
确认当前模式
print(type(poco.agent.input).__name__)
# AirtestInput → 设备触摸
# StdInput → RPC Click
两种模式对比
|
use_airtest_input=True(默认) |
use_airtest_input=False |
| 点击实现 |
Airtest touch → minitouch/adb |
RPC "Click" → Unity SDK |
| 是否需要 Android 设备 |
需要(UnityPoco 会 connect_device("Android:///")) |
RPC 本身不需要,但 UnityPoco 仍会连 Android |
| 适用场景 |
真机/模拟器触摸 |
Unity 内模拟点击、Editor 调试 |
前提条件
- Unity 工程已集成 PocoSDK,且实现了
Click 等输入接口
- 游戏内 Poco 服务已启动(默认端口 5001)
- Python 端能连上该端口(Android 上会通过 adb forward 转发)
推荐组合
- 真机自动化:默认
use_airtest_input=True,走 Airtest 触摸,兼容性最好
- Unity 内点击 / Editor 调试:
use_airtest_input=False,走 RPC Click,由游戏侧处理输入
- 若只在 Unity Editor 跑、不想依赖 Android,需改
UnityPoco 初始化(当前硬编码 connect_device("Android:///")),或直接用 StdPoco 自行处理连接
[Poco][Unity] post_action 与 RPC Click 接口分析
post_action 是什么
post_action本身不会触发点击,也不会调用任何设备/Unity 接口。它只是一个动作完成后的回调钩子,用来通知已注册的 callback。默认只注册了
on_post_action(空实现pass)。可通过add_post_action_callback()注册自定义逻辑(日志、截图、重试等)。参数含义:
action'click'uiUIObjectProxy对象argspos_in_percentage,如[0.5, 0.3]完整 click 调用链
poco("StartButton").click()的执行顺序:get_position()— 通过 RPC 从 Unity 侧取 UI 节点坐标(pos、size、anchorPoint)pre_action('click', ...)— 动作前回调poco.click(pos)— 真正点击wait_stable()— 等待 UI 稳定(默认 0.5~0.8s)post_action('click', ...)— 动作后回调(不执行点击)UnityPoco 默认点击路径(Airtest)
UnityPoco继承StdPoco,StdPocoAgent默认use_airtest_input=True:默认路径:
坐标来源仍走 Unity RPC(
Dump/GetAttr),只是触摸注入走 Airtest 设备层。如何走 RPC Click 接口
初始化时设置
use_airtest_input=False:RPC 路径:
直接用 StdPoco
手动调 RPC
StdInput 支持的 RPC 方法
ClickSwipeLongClickDoubleClickRClickKeyEvent确认当前模式
两种模式对比
use_airtest_input=True(默认)use_airtest_input=Falsetouch→ minitouch/adb"Click"→ Unity SDKconnect_device("Android:///"))前提条件
Click等输入接口推荐组合
use_airtest_input=True,走 Airtest 触摸,兼容性最好use_airtest_input=False,走 RPCClick,由游戏侧处理输入UnityPoco初始化(当前硬编码connect_device("Android:///")),或直接用StdPoco自行处理连接