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()。请参阅原始问题)。
你很可能知道,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()。请参阅原始问题)。