Version: 2017.2
iOS のスクリプト
上級者向け Unity モバイルスクリプト

iOS Game Controller への対応

OS 7 以降、Apple は、標準の Game Controller Input API を提供しています。 この API に関する対応は Unity の標準 Input API に含まれています。

接続された Game Controllers の検知

Input.GetJoystickNames` を呼び出すと、添付のすべてのコントローラーの名前がリストアップされます。名前は “[$profile_type,$connection_type] joystick $number by $model” というパターンになります。 $profile_type は “basic” か “extended”、 $connection_type は “wired” か “wireless” です。これは、接続されたコントローラーの種類を検知するためにも使用できます。コントローラーの接続が追加されたり切断されたりしていないか数秒ごとにこのリストをチェックして確認するとよいでしょう。以下の例は、 C# でこれを行う方法です。

private bool connected = false;

IEnumerator CheckForControllers() {
    while (true) {
        var controllers = Input.GetJoystickNames();
        if (!connected && controllers.Length > 0) {
            connected = true;
            Debug.Log("Connected");
        } else if (connected && controllers.Length == 0) {
            connected = false;
            Debug.Log("Disconnected");
        }
        yield return new WaitForSeconds(1f);
    }
}

void Awake() {
    StartCoroutine(CheckForControllers());
}

コントローラーが検知されたら、オンスクリーンのタッチ制御を非表示にしたり、コントローラー入力の補完として使用することも可能です。次に、Game Controller の入力を確認します。

入力の取り扱い

実際の入力スキームは開発ゲームの種類によって変わりますが、いずれの方式にしても基本は軸の読み取りとボタンの状態の組み合わせということになります。以下の 2D ゲームステージは、簡単な参考例です。

プレイヤーは Bean のキャラクターを操作します。このキャラクターは左右に移動したりジャンプしたり敵を射撃したりできます。デフォルトでは Unity Input の “Horizontal” 軸は基本プロファイルゲームコントローラーの十字キーにマッピングされ、左アナログスティックが拡張プロファイルコントローラーにマッピングされています。そのため、キャラクターを前後に動かすためにコードは非常にシンプルです。

float h = Input.GetAxis("Horizontal");
if (h * rigidbody2D.velocity.x < maxSpeed)
    rigidbody2D.AddForce(Vector2.right * h * moveForce);

Unity の Input Manager で、ジャンプや射撃のアクションを設定できます。

  • Unity editor メニューから次の順で進んでください。 Edit > Project Settings > Input

  • “Jump” のアクションにはジョイスティックの “A” ボタンを、“Fire” には “X” ボタンを選びます。

  • Unity Input Manager 上で次のアクションを開き、“Jump” に “joystick button 14” を指定し、“Fire” に “joystick button 15” を指定します。

コードの処理はこのようになります。

if (Input.GetButtonDown("Jump") && grounded) {
    rigidbody2D.AddForce(new Vector2(0f, jumpForce));
}

if (Input.GetButtonDown("Fire")) {
    Rigidbody2D bulletInstance = Instantiate(rocket, transform.position, Quaternion.Euler(new Vector3(0,0,0))) as Rigidbody2D;
    bulletInstance.velocity = new Vector2(speed, 0);
}

以下の表は、Unity Input Manager 上でコントローラー入力をマッピングする際の参考にしてください。

Name キーコード
A joystick button 14 joystick axis 14
B joystick button 13 joystick axis 13
X joystick button 15 joystick axis 15
Y joystick button 12 joystick axis 12
Left Stick 該当なし Axis 1 (X) - Horizontal、Axis 2 (Y) - Vertical
Right Stick 該当なし Axis 3 - Horizontal、Axis 4 - Vertical
Dpad Up joystick button 4 Basic profile only: Axis 2 (Y)
Dpad Right joystick button 5 Basic profile only: Axis 1 (X)
Dpad Down joystick button 6 Basic profile only: Axis 2 (Y)
Dpad Left joystick button 7 Basic profile only: Axis 1 (X)
Pause joystick button 0 該当なし
L1/R1 joystick button 8 / joystick button 9 joystick axis 8 / joystick axis 9
L2/R2 joystick button 10 / joystick button 11 joystick axis 10 / joystick axis 11

Game Controller API への対応に関するその他の事項

Unity only includes the Game Controller framework in the project if a script in the project references Input.GetJoystickNames. Unity iOS Runtime loads the framework dynamically, if it is available. For older iOS versions it returns an empty list of controllers.

Apple のドキュメントには、コントローラー入力はあくまでもオプションとして扱わねばならず、それ無しでもプレイ可能にしなければならないと明記されています。

iOS のスクリプト
上級者向け Unity モバイルスクリプト