Version: 2017.3
iOS 스크립팅
고급 Unity 모바일 스크립팅

iOS 게임 컨트롤러 지원(iOS Game Controller support)

Apple은 OS 7부터 표준 게임 컨트롤러 입력 API를 제공합니다. Unity는 이 API를 스탠다드 Unity 입력 API의 일부로 지원합니다.

연결된 게임 컨트롤러(Game Controllers) 인식

Input.GetJoystickNames를 호출하면 연결된 모든 컨트롤러의 이름이 열거됩니다. 이름은 “[$profile_type,$connection_type] 조이스틱 $number by $model” 패턴을 따릅니다. $profile_type은 “베이직” 또는 “익스텐디드” 중 하나일 수 있고, $connection_type은 “와이어드” 또는 “와이어리스” 중 하나입니다. 이를 사용하여 연결된 컨트롤러의 종류를 인식할 수 있습니다. 컨트롤러가 연결 또는 분리되었는지 인식하기 위해 리스트를 몇 초마다 다시 확인하는 것이 좋습니다. 다음은 작업을 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 게임 스테이지를 간단한 예로 들어보겠습니다.

플레이어가 콩 캐릭터를 조종합니다. 캐릭터는 좌우로 이동하고, 점프하고, 적에게 발사할 수 있습니다. Unity 입력 “가로” 축은 기본적으로 기본 프로파일 게임 컨트롤러 D패드와 확장 프로파일 컨트롤러의 왼쪽 아날로그 스틱에 매핑됩니다. 따라서 캐릭터를 앞뒤로 움직이는 코드는 다음과 같이 매우 간단합니다.

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

점프 및 발사 액션은 Unity의 Input Manager에서 설정할 수 있습니다.

  • 여기에는 Unity 에디터 메뉴에서 Edit > Project Settings > Input를 통해 액세스합니다.

  • 조이스틱의 “A” 버튼을 “점프” 액션으로 선택하고 “X” 버튼을 “발사”로 선택합니다.

  • Unity 입력 관리자에서 다음 액션을 열고 “조이스틱 버튼 14”를 “점프”로 지정하고 “조이스틱 버튼 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 입력 관리자에서 컨트롤러 입력을 매핑하는 데 유용합니다.

이름 키코드
A 조이스틱 버튼 14 조이스틱 축 14
B 조이스틱 버튼 13 조이스틱 축 13
X 조이스틱 버튼 15 조이스틱 축 15
Y 조이스틱 버튼 12 조이스틱 축 12
Left Stick 해당 없음 축 1(X) - 가로, 축 2(Y) - 세로
오른쪽 스틱 해당 없음 축 3 - 가로, 축 4 - 세로
D패드 위로 조이스틱 버튼 4 기본 프로파일에만 해당: 축 2(Y)
D패드 오른쪽 조이스틱 버튼 5 기본 프로파일에만 해당: 축 1(X)
D패드 아래로 조이스틱 버튼 6 기본 프로파일에만 해당: 축 2(Y)
D패드 왼쪽 조이스틱 버튼 7 기본 프로파일에만 해당: 축 1(X)
일시정지 조이스틱 버튼 0 해당 없음
L1/R1 조이스틱 버튼 8/조이스틱 버튼 9 조이스틱 축 8/조이스틱 축 9
L2/R2 조이스틱 버튼 10/조이스틱 버튼 11 조이스틱 축 10/조이스틱 축 11

게임 컨트롤러(Game Controller) API 지원에 관한 최종 참고 사항

Unity는 프로젝트의 스크립트에서 Input.GetJoystickNames를 레퍼런스하는 경우에만 게임 컨트롤러 프레임워크를 프로젝트에 포함시킵니다. Unity iOS Runtime은 사용 가능한 프레임워크를 동적으로 로드합니다. 이전 iOS 버전에서는 빈 컨트롤러 리스트가 반환됩니다.

Apple 문서에는 컨트롤러 입력이 선택 사항이어야 하고 컨트롤러 없이도 게임을 플레이할 수 있어야 한다고 명시되어 있습니다.

iOS 스크립팅
고급 Unity 모바일 스크립팅