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 上でコントローラー入力をマッピングする際の参考にしてください。

名前 KeyCode Axis
A joystick button 14 joystick axis 14
B joystick button 13 joystick axis 13
X joystick button 15 joystick axis 15
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 Left/Right joystick button 7 / joystick button 5 Basic profile only: Axis 1 (X)
Dpad Up/Down joystick button 4 / joystick button 6 Basic profile only: Axis 2 (Y)
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 への対応に関するその他の事項

Game Controller フレームワークは、Unity iOS ランタイムのみで動的に読み込まれます。古い iOS バージョンでは、空のコントローラーリストが返されます。

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

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