Skip to content

[Poco][Unity] post_action 与 RPC Click 接口分析 #42

@nzcv

Description

@nzcv

[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() 的执行顺序:

  1. get_position() — 通过 RPC 从 Unity 侧取 UI 节点坐标(possizeanchorPoint
  2. pre_action('click', ...) — 动作前回调
  3. poco.click(pos)真正点击
  4. wait_stable() — 等待 UI 稳定(默认 0.5~0.8s)
  5. 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 继承 StdPocoStdPocoAgent 默认 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 调试

前提条件

  1. Unity 工程已集成 PocoSDK,且实现了 Click 等输入接口
  2. 游戏内 Poco 服务已启动(默认端口 5001)
  3. 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 自行处理连接

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions