【问题标题】:Precisely simulating an xbox controller for Unity game为 Unity 游戏精确模拟 xbox 控制器
【发布时间】:2020-10-28 17:15:29
【问题描述】:

我正在尝试通过 python 模拟控制器,但有时间问题。

我已经成功地将输入读入dictionary,然后将它们全部收集到一个列表中。我知道游戏(在 Unity 中)识别输入的速度不能超过 0.2 秒。使用以下函数,我使用以下函数在 0.2 秒内完成了写入,误差小于 0.001 秒:

def feed(line: list, interval: float = 0.1.99):
    start = time_ns()
    wait_ns = interval * 10**9
    for moment in list:
        while (time_ns() < start + wait_ns):
            pass
        for key, val in moment:
            controller.set_value(key, val) #this feeds the keys to the game via pyxinput.

我正在使用与上述类似的函数对输入进行采样。但是,我没有得到正确的行为,它似乎是一个时间问题。我尝试读取合成输入,它们以正确的时间输入,即我传入的时间间隔(以及上述错误)。

作为参考,以下硬编码输入可以正常工作。

controller.set_value('AxisLy', -1) #push the stick down
sleep(0.2)
controller.set_value('AxisLy', 0) #return it to neutral

在过去几天与此作斗争后,我已经束手无策了。那么,对于可能出现的问题或如何调试它有什么想法吗?

【问题讨论】:

    标签: python gamepad xinput


    【解决方案1】:

    尝试使用Invoke() 或coroutine,而不是在睡眠间隔中进行硬编码。当您想要等待一段时间时,我发现它们非常简单、有用且易于理解。或者,使用 Time.time 跟踪按钮按下的开始时间,然后检查系统时钟时间是否为 (Time.time >= startTime + interval)。

    对不起 C#,这是我更熟悉的。但是你应该能够理解它的要点。

    【讨论】:

    • 我不介意 C#。但是(a)我的框架的其余部分是用 Python 编写的,并且(b)我没有游戏的源代码。给定(b),有没有办法使用 Mono 函数(最好是通过 Python,但我会很感激任何方式)?不过,感谢您提出新的思路,受到智者的赞赏:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2020-08-30
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多