2017-10-13 5 views
0

あなたが知っているように、Unity3Dはビルドイン入力システムがひどいので、コンフィギュレーションランタイムを変更できないので、SharpDX直接入力。私はよく知っているdirectInputは公式のrecomendetではありませんが、私はすべての種類のデバイスで動作する能力のためにそれが好きです(私のPSXエミュレーションのために購入オリジナル。Unity3DのSharpDx - エディタの他のウィンドウをクリックしてもボタンが動かない

私は、私は(ちなみに、かなりひどい方法)ユニティに置き換わるボタンオブジェクト

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; 
    } 
} 

をrepresentateするには、以下のクラスを使用して自分でInput.GetKeyDown(あなたが団結のクラスの一つとして同じクラスに名前を付ける場合は、交換してくださいそれは。私は誰かがここでの静的の使用を好きではない必要があります知っているが、私は)それは非常にbenefical参照

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; 
} 

しかし、私はInput.Initializeを呼び出して、すべての前に(アウェイク中に(他のクラスから)())。次のようになります。

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(); 
    } 

問題が発生しました。エディタでゲームウィンドウの外にあるものをクリックすると、キーはもう反応しません。私はすべてをチェックし、directInputとkeyboardの両方が変数に入っています。この問題は、ゲームウィンドウがフォーカスを失うと直ちに切断されます(ウィンドウがアクティブウィンドウでない場合はフォーカスが失われ、アクティブウィンドウはアクティブではなく "フォーカスされた ")。

誰かがなぜこの起こり、それを修復するのか知っていますか?

EDIT:この問題は、何らかの形でウィンドウに接続されているように見えます。私は設定があり、私はフルスクリーンランタイムを切り替えることができます。私はフルスクリーンでは、それはうまく動作しますが、私はウィンドウに切り替えると、それは動作を停止します。

ありがとうございました。

-Garrom

答えて

0

は、今私は、とにかく、私は右のアブー・ウィンドウのフォーカスだった...非常に愚かな人として自分自身を参照してください。ゲームウィンドウがフォーカスを失ったときに(何とか)、directInputを破ります。私はゲームウィンドウがフォーカスされるたびに、このユニティのコールバックOnApplicationFocusと再初期化(Initialize()を呼び出し、元の質問を参照)を解決しました。

関連する問題