小编Met*_*DoS的帖子

在 C# 中记住和重放击键:同步问题

我是 PC 游戏的速通玩家(喜欢以尽可能快的方式完成游戏的人),我想在玩游戏时记录我的输入,以便稍后自动重播。所以我创建了一个小 C# 程序来做到这一点:基本上,它会启动一个计时器,每次我按下/松开一个键时,它都会保存操作(keyup/keydown)、键以及我这样做的毫秒数。然后,当我想再次播放它时,它会启动一个计时器,当它达到发生击键的毫秒时,它会重现它。

它有效!嗯...事实上,它几乎可以工作:键复制得很好,但有时,它们有点不同,导致我之前成功的意外死亡。

这是显示问题的视频:https : //www.youtube.com/watch?v=4RPkcx68hpw&feature=youtu.be

上面的视频是重制键,下面的视频是原版播放。一切似乎都相似,直到第 3 个房间,原始戏剧击中“蜘蛛”并使其返回,而复制的键不接触它,因此它干扰了其余的进程。当然,这部分游戏是 100% 确定的,因此相同的输入会导致相同的结果。通过在我的视频编辑器中逐帧推进视频,当角色爬上第一个板条箱时,我清楚地看到了 2 帧的差距,并且这个差距继续扩大。

这是我的(大量评论)代码:

KeysSaver.cs,保存我输入的类

class KeysSaver
{
    public static IntPtr KEYUP = (IntPtr)0x0101; // Code of the "key up" signal
    public static IntPtr KEYDOWN = (IntPtr)0x0100; // Code of the "key down" signal
    private Stopwatch watch; // Timer used to trace at which millisecond each key have been pressed
    private Dictionary<long, Dictionary<Keys, IntPtr>> savedKeys; // Recorded keys activity, indexed by the millisecond the …
Run Code Online (Sandbox Code Playgroud)

c# keystroke keyboard-hook recorder keyboard-events

5
推荐指数
1
解决办法
1013
查看次数

新的输入系统不再触发任何东西

这篇文章是我在 Unity 论坛上的帖子的无耻的复制/粘贴:https : //forum.unity.com/threads/input-system-doesnt-trigger-anything-anymore.717386/,但 Stack Overflow 似乎更活跃

TL;DR:几天前 InputSystem 工作了,不要再触发任何东西了,呸。

几天前我尝试了新的输入系统,真是太棒了!我做了很多事情,试图了解使用它的最佳方式,最后,我有一个角色到处跳跃和移动,这很酷!然后,我将我的代码合并到我们的开发分支中并上床睡觉。

今天,我想继续我的代码,但我的角色不再移动,没有触发动作(即使在调试器中检测到输入),我真的不知道为什么。要么代码合并覆盖了一些重要的设置(我知道你在想什么,是的,“活动输入处理”设置在“两者”上,我尝试只运行预览)或者我在我的小测试中做了一些重要的事情,我没有意识到。

所以我决定尝试在一个全新的项目上重现我的步骤,也许你们能帮我弄清楚我做错了什么?

1/ 创建一个新的 2D 项目(通过 Hub)

2/安装最新的Package(0.9.0版)

3/在该消息提示上单击是以激活设置中的新输入管理 迅速的

4/ 重新启动 Unity Editor 因为它没有重新启动,即使消息说它会重新启动并检查项目设置(是的,它在“Both”上,是的,我的脚本运行时版本是 4.0) 设置

5/ 创建一个新的 GameObject 并在其上添加一个 PlayerInput

6/点击“打开输入设置”并创建一个“输入设置”资产

7/ 点击“Create Actions...”来创建我的ActionMap资产

8/ 在我的“Player”ActionMap 上创建一个“TestAction”并将其设置为键“t”

[附件=满]457769[/附件]

9/ 创建一个新脚本“TestScript”,其中包含一个 OnTestAction() 方法(仅记录“测试”)并启用测试地图/操作(只是为了确定):

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.PlayerInput;

public class TestScript : MonoBehaviour
{
    void Start()
    {
        InputActionMap playerActionMap = GetComponent<PlayerInput>().actions.GetActionMap("Player");
        playerActionMap.Enable();
        playerActionMap.GetAction("TestAction").Enable(); //Just to be sure
    }

    public void OnTestAction()
    {
        Debug.Log("test");
    }
}
Run Code Online (Sandbox Code Playgroud)

10/ 像疯子一样按“播放”并发送垃圾邮件“T”以尝试显示调试(请注意,在调试器中,创建了一个用户,检测到我的“t”按下,我的 …

c# unity-game-engine

5
推荐指数
3
解决办法
6174
查看次数