コガネブログ

平日更新を目標にUnityやC#、Visual Studioなどのゲーム開発アレコレを書いていきます

【Unity】有料アセット「InControl」を導入して Nintendo Switch のプロコン(Pro コントローラー)を簡単に使えるようにする($37.80)

概要

 
2014/2/19 に「InControl」がリリースされました
「InControl」を導入すると、Xbox 360 や PS3、PS4 などのコントローラの入力制御を
簡単に実装できるようになります

この記事では、Unity プロジェクトに「InControl」を導入して
Nintendo Switch のプロコン(Pro コントローラー)を
簡単に使えるようにする方法を紹介していきます

検証環境

  • Unity 2017.4.0f1
  • InControl 1.6.17

プロコンを PC に接続する方法

こちらのページに記載しております

初期設定

f:id:baba_s:20180501200512p:plain

「InControl」を Unity プロジェクトに導入したら Unity メニューの
「Edit>Project Settings>InControl>Setup InputManager Settings」を選択します

f:id:baba_s:20180501200601p:plain

Console ウィンドウや Unity エディタの左下に
「InControl has successfully generated new InputManager settings.」と表示されたら
初期設定が完了です

接続確認

f:id:baba_s:20180501200901p:plain

「TestInputManager」シーンを開いて Unity を再生すると、
プロコンが正しく接続できているかどうかが確認できます

f:id:baba_s:20180501201238g:plain

ボタンを押したりスティックを倒したりすると、正常に判定されていることがわかります

使い方

ここからは実際にゲームに組み込んでいく方法を紹介していきます

f:id:baba_s:20180501201426p:plain

Unity メニューの「GameObject>Create Other>InControl>Manager」を選択して、

f:id:baba_s:20180501201623p:plain

「InControl」オブジェクトを作成します

f:id:baba_s:20180501202340p:plain

そして、作成した「InControl」オブジェクトを選択して
「Enable Native Input (Mac/Windows only)」をチェックします

using InControl;

次に、プロコンの入力制御を実装したいコードの先頭に上記の using を追加します
そして、下記のようなコードを記述することで、
ボタンが押されたかどうかの判定や、スティックの傾きの取得ができます

以上が基本的な使い方になります

ボタンの判定

var ad = InputManager.ActiveDevice;

if ( ad.Action2.WasPressed  ) print( "押された" );
if ( ad.Action2.IsPressed   ) print( "押されている" );
if ( ad.Action2.WasReleased ) print( "離された" );

ボタンの判定は上記の 3 パターンで判定できます

コントローラの接続・解除の検知

InputManager.OnDeviceAttached += device => 
{
    print( "接続:" + device.Name );
};
InputManager.OnDeviceDetached += device => 
{
    print( "解除:" + device.Name );
};
InputManager.OnActiveDeviceChanged += device => 
{
    print( "アクティブ変更: " + device.Name );
};

ゲーム中にコントローラが接続されたかどうか、解除されたかどうかは
上記のようにイベントを使用して検知することができます

スティックが倒された時に true を返す拡張メソッド

ソースコード

using InControl;

public static class OneAxisInputControlExt
{
    public static bool IsDown
    ( 
        this OneAxisInputControl self, 
        float value = 0.5f 
    )
    {
        return 
            value <= self.Value && 
            self.LastValue <= value
        ;
    }
}

使用例

var ab = InputManager.ActiveDevice;

// 左スティックが上に倒された
if ( ab.LeftStickUp.IsDown() )
{
}

スティックでメニューを選択するような機能を実装する時に
上記のような拡張メソッドを定義すると役に立ちます