Unity は標準の Unity Input API の一部として Apple が提供する標準化された Game Controller Input API をサポートしています。
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 |
プロジェクトのスクリプトが Input.GetJoystickNames
を参照している場合、Unity はプロジェクトの Game Controller フレームワークのみを含みます。Unity iOS Runtime は、使用可能な場合、動的にフレームワークを読み込みます。
Apple のドキュメントには、コントローラー入力はあくまでもオプションとして扱わねばならず、それ無しでもプレイ可能でなければならないと明記されています。