Unity3D 中的 SharpDx - 单击编辑器的其他 window 时按钮不再起作用

SharpDx in Unity3D - Buttons does not work anymore when click other window of editor

你很可能知道,Unity3D 有糟糕的内置输入系统,无法更改配置运行时,所以我决定编写自己的基于 SharpDX DirectInput 的输入系统。我很清楚 directInput 不是官方推荐的,但我喜欢它能够与各种设备一起工作(比如我的 Trust 双摇杆游戏手柄 GTX 28。最初购买是为了 PSX 仿真)。

我在下面使用class来表示按钮对象

public class InputButton
{
    public JoystickOffset button;
    public Key key;
    public int pressValue;
    public int relaseValue;
    public bool isJoystick;
    public InputButton(JoystickOffset button, int pressValue, int relaseValue)
    {
        this.button = button;
        this.pressValue = pressValue;
        this.relaseValue = relaseValue;
        isJoystick = true;
    }
    public InputButton(Key key, int pressValue, int relaseValue)
    {
        this.key = key;
        this.pressValue = pressValue;
        this.relaseValue = relaseValue;
        isJoystick = false;
    }
}

然后我将 Unity 的(顺便说一句,非常糟糕的方法)Input.GetKeyDown 替换为我自己的(如果您命名 class 与 unity 的 classes 之一相同,您将替换它。我知道有人一定不喜欢在这里使用静态,但我认为它非常有益)

public static bool GetKeyDown(InputButton button)
{
    bool pressed = false;
    keyboard.Poll();
    keyboardData = keyboard.GetBufferedData();
    if (button.isJoystick == false)
    {
        foreach (var state in keyboardData)
        {
            if (state.Key == button.key && state.Value == button.pressValue)
            {
                pressed = true;
            }
        }
    }
    return pressed;
}

但在我从另一个 class 调用 Input.Initialize() 之前(在 Awake() 期间)。它看起来像这样:

  public static void Initialize()
    {
        directInput = new DirectInput();
        var joystickGuid = Guid.Empty;
        foreach (var deviceInstance in directInput.GetDevices(SharpDX.DirectInput.DeviceType.Joystick, DeviceEnumerationFlags.AttachedOnly))
        {
            joystickGuid = deviceInstance.InstanceGuid;
        }
        if (joystickGuid == Guid.Empty)
        {
            foreach (var deviceInstance in directInput.GetDevices(SharpDX.DirectInput.DeviceType.Gamepad, DeviceEnumerationFlags.AttachedOnly))
            {
                joystickGuid = deviceInstance.InstanceGuid;
            }
        }
        if (joystickGuid != Guid.Empty)
        {
            joystick = new Joystick(directInput, joystickGuid);
            joystick.Properties.BufferSize = 128;
            joystick.Acquire();
        }
        keyboard = new Keyboard(directInput);
        keyboard.Properties.BufferSize = 128;
        keyboard.Acquire();
    }

现在进入正题。当我在编辑器中点击游戏外的任何内容 window 时,按键不再响应。我检查了所有内容,directInput 和 keyboard 仍在变量中。 window 的 "Focus" 很可能存在一些问题,因为这个问题看起来像 directInput 实例或键盘在游戏 window 失去焦点时立即断开连接(当 window 不是时焦点丢失active window, active window 不是 "active" 而是所谓的 "focused").

有人知道为什么会发生这种情况以及如何修复吗?

编辑:看起来这个问题与 window(s) 有某种联系。我有设置,我可以切换全屏运行时。只要我处于全屏模式,它就可以正常工作,但是当我切换到 window 时,它就会停止工作。

谢谢。

-加罗姆

现在我认为自己是一个非常愚蠢的人...无论如何我是对的 window 专注。当游戏 window 失去焦点时,它(以某种方式)中断了直接输入。我使用统一的回调 OnApplicationFocus 解决了这个问题,并在每次游戏 window 获得焦点时重新初始化(调用 Initialize()。请参阅原始问题)。