Version: 2017.1
IOS cкриптинг
Продвинутый скриптинг в Unity для мобильных платформ

Поддержка игровых контроллеров на iOS

Начиная с OS 7, был Apple предоставлен стандартизированный API для игровых контроллеров. В Unity поддержка этого API выражается через стандартный Unity 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());
}

При обнаружении контроллера, вы можете либо скрыть кнопки управления для сенсорного экрана или изменить их для дополнения к контроллеру. Следующей целью является проверка входящей информации с игровых контроллеров.

Обработка входящей информации

Реальная система управления очень зависит от того, какого типа игру вы разрабатываете. Но в любом случае, всё сводится к чтению осей и состояния кнопок. Используйте следующую 2D игровой уровень, в качестве простого примера:

The player controls the bean character, which can move right or left, jump and fire at the bad guys. By default, the Unity Input “Horizontal” axis is mapped to basic profile game controller dpad and the left analog stick on extended profile controllers. So the code used to move the character back and forth is pretty simple:

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

You can set up jump and fire actions in Unity’s Input Manager.

  • Access it from the Unity editor menu as follows: Edit > Project Settings > Input.

  • Pick joystick button “A” for the “Jump” action and “X” for “Fire”.

  • Open the following actions in the Unity Input Manager and specify “joystick button 14” for “Jump” and “joystick button 15” for “Fire”.

The code handling then looks like this:

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);
}

The following cheatsheet should help you map controller input in the 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
Левый стик N/A Ось 1 (X) - горизонтальная, ось 2 (Y) - вертикальная
Правый стик N/A 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)
Пауза joystick button 0 N/A
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

Final notes on Game Controller API support

The Game Controller framework is loaded dynamically by Unity iOS runtime only if it is available. For older iOS versions it will just return an empty list of controllers.

Apple documentation explicitly states that controller input must be optional and your game should be playable without them.

IOS cкриптинг
Продвинутый скриптинг в Unity для мобильных платформ