Version: 2018.4
言語: 日本語
iOS のスクリプト
上級者向け Unity モバイルスクリプト

iOS Game Controller への対応

Unity は標準の Unity Input API の一部として Apple が提供する標準化された Game Controller 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 ゲームステージを簡単な例として取り上げます。

プレイヤーは、左右に移動し、悪人に飛び掛かり、発砲することができる豆のようなキャラクターを制御します。デフォルトでは、Unity Input の Horizontal (水平方向) 軸は基本的なプロファイルのゲームコントローラーの D-pad と、拡張されたプロファイルコントローラーの左のアナログスティックにマッピングされます。そのため、キャラクターを前後に移動させるコードはとてもシンプルです。

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

Unity の Input 設定で “Jump” (ジャンプする) アクションと “Fire” (発砲する) アクションを設定できます。

  • Unity のエディターメニューから Edit > Project Settings の順にアクセスし、Input カテゴリを選択します。

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

  • Unity Input 設定で以下のアクションを開き、“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 設定でコントローラー入力をマッピングするのに役立ちます。

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
D-pad Up joystick button 4 Basic profile only: Axis 2 (Y)
D-pad Right joystick button 5 Basic profile only: Axis 1 (X)
D-pad Down joystick button 6 Basic profile only: Axis 2 (Y)
D-pad 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 への対応に関するその他の事項

プロジェクトのスクリプトが Input.GetJoystickNames を参照している場合、Unity はプロジェクトの Game Controller フレームワークのみを含みます。Unity iOS Runtime は、使用可能な場合、動的にフレームワークを読み込みます。

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


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