Version: Unity 6.0 (6000.0)
언어 : 한국어
입력 관리자
Unity의 IME

모바일 디바이스 입력

| | |—| | 중요: 이 페이지에서는 Input Manager 시스템의 일부에 대해 설명합니다. 이는 레거시 기능이며 새 프로젝트에는 권장하지 않습니다. 새 프로젝트의 모바일 디바이스 입력에는 Input System 패키지를 사용해야 합니다. |


모바일 디바이스의 경우, Input 클래스를 통해 터치스크린, 가속 센서, 지리/위치 정보 입력 등에 액세스할 수 있습니다.

모바일 디바이스의 키보드 액세스는 모바일 키보드를 통해 제공됩니다.

멀티터치 스크린

iPhone, iPad, iPod Touch 디바이스는 최대 5개의 손가락으로 동시에 화면을 터치하는 것을 추적할 수 있습니다. Input.touches 프로퍼티 배열에 액세스하여 마지막 프레임 동안 화면을 터치한 각 손가락의 상태를 가져올 수 있습니다.

Android 디바이스에는 추적하는 손가락 수에 대한 통일된 제한이 없습니다. 디바이스마다 다르며 구형 디바이스는 2점 터치까지, 일부 최신 디바이스는 5점 터치까지 추적할 수 있습니다.

각 터치는 Input.Touch 데이터 구조를 통해 나타납니다.

프로퍼티: 설명:
fingerId 터치의 고유 인덱스입니다.
position 터치의 화면 위치입니다.
deltaPosition 마지막 프레임 이후의 화면 위치 변경을 나타냅니다.
deltaTime 마지막 상태 변경 이후 흐른 시간을 나타냅니다.
tapCount iPhone/iPad 화면은 사용자가 손가락으로 빠르게 탭하는 것을 구분할 수 있습니다. 이 카운터는 사용자가 손가락을 옆으로 움직이지 않고 화면을 탭한 횟수를 알려 줍니다. Android 디바이스는 탭 수를 집계하지 않으며 이 필드는 항상 1입니다.
phase 사용자가 방금 화면을 터치하기 시작했는지, 손가락을 움직였는지, 손가락을 뗐는지 확인할 수 있는 터치 상태를 설명합니다.
Began 손가락이 막 화면을 터치하였습니다.
Moved 손가락이 화면 위에서 움직였습니다.
Stationary 손가락이 화면을 터치하고 있으나 마지막 프레임 이후로 움직이지 않고 그대로 있습니다.
Ended 손가락을 화면에서 뗐습니다. 이는 터치의 마지막 단계입니다.
Canceled 예를 들어 사용자가 디바이스를 얼굴에 대거나 다섯 군데 이상의 지점에서 동시에 터치한 경우, 시스템은 터치 추적을 취소합니다. 이는 터치의 마지막 단계입니다.

다음은 사용자가 화면을 터치할 때마다 광선을 방사하는 예제 스크립트입니다.

using UnityEngine;

public class TouchInput : MonoBehaviour
{
    GameObject particle;

    void Update()
    {
        foreach(Touch touch in Input.touches)
        {
            if (touch.phase == TouchPhase.Began)
            {
                // Construct a ray from the current touch coordinates
                Ray ray = Camera.main.ScreenPointToRay(touch.position);
                if (Physics.Raycast(ray))
                {
                    // Create a particle if hit
                    Instantiate(particle, transform.position, transform.rotation);
                }
            }
        }
    }
}

마우스 시뮬레이션

Unity iOS/Android는 네이티브 터치 지원 외에도 마우스 시뮬레이션을 제공합니다. 표준 Input 클래스에서 마우스 기능을 사용할 수 있습니다. iOS/Android 디바이스는 멀티터치를 지원하도록 설계되었습니다. 마우스 기능을 사용하면 손가락 하나로만 터치할 수 있습니다. 또한 모바일 디바이스에서 손가락 터치는 한 영역에서 다른 영역으로 드래그하지 않고 이동할 수 있습니다. 모바일 디바이스의 마우스 시뮬레이션은 이동을 제공하므로 터치 입력과는 매우 다릅니다. 개발 초기에는 마우스 시뮬레이션을 사용하는 것이 좋지만 최대한 빨리 터치 입력을 사용하는 것이 좋습니다.

가속 센서

모바일 디바이스가 움직이면 빌트인 가속 센서가 3차원 공간의 세 개의 기본 축을 따라 선형 가속도 변화를 보고합니다. 각 축에 대한 가속도는 G-force의 값으로 하드웨어에서 직접 통보됩니다. 값이 1.0이면 주어진 축에 약 +1g의 하중이 실린다는 의미이며, 값이 –1.0이면 –1g의 하중이 실린다는 의미입니다. 홈 버튼이 아래쪽에 있는 상태로 디바이스를 앞에 똑바로 세우면 X축은 오른쪽을 따라 양의 방향이고 Y축은 바로 위쪽을 따라 양의 방향이며 Z축은 사용자쪽을 따라 양의 방향입니다.

가속 센서 값은 Input.acceleration 프로퍼티에 액세스하여 가져올 수 있습니다.

다음 스크립트는 가속 센서를 사용하여 오브젝트를 움직이는 예제입니다.

using UnityEngine;

public class Accelerometer : MonoBehaviour
{
    float speed = 10.0f;

    void Update()
    {
        Vector3 dir = Vector3.zero;
        // we assume that the device is held parallel to the ground
        // and the Home button is in the right hand

        // remap the device acceleration axis to game coordinates:
        // 1) XY plane of the device is mapped onto XZ plane
        // 2) rotated 90 degrees around Y axis

        dir.x = -Input.acceleration.y;
        dir.z = Input.acceleration.x;

        // clamp acceleration vector to the unit sphere
        if (dir.sqrMagnitude > 1)
            dir.Normalize();

        // Make it move 10 meters per second instead of 10 meters per frame...
        dir *= Time.deltaTime;

        // Move object
        transform.Translate(dir * speed);
    }
}

로우 패스 필터

가속 센서 수치가 들쑥날쑥하고 노이즈가 심할 수 있습니다. 신호에 로우 패스 필터링을 적용하면 신호를 부드럽게 만들고 고주파 노이즈를 제거할 수 있습니다.

using UnityEngine;

public class LowPassFilterExample : MonoBehaviour
{
    float accelerometerUpdateInterval = 1.0f / 60.0f;
    float lowPassKernelWidthInSeconds = 1.0f;

    private float lowPassFilterFactor;
    private Vector3 lowPassValue = Vector3.zero;

    void Start()
    {
        lowPassFilterFactor = accelerometerUpdateInterval / lowPassKernelWidthInSeconds;
        lowPassValue = Input.acceleration;
    }

    private void Update()
    {
        lowPassValue = LowPassFilterAccelerometer(lowPassValue);
    }

    Vector3 LowPassFilterAccelerometer(Vector3 prevValue)
    {
        Vector3 newValue = Vector3.Lerp(prevValue, Input.acceleration, lowPassFilterFactor);
        return newValue;
    }
}

LowPassKernelWidthInSeconds의 값이 클수록 필터링된 값이 현재 입력 샘플로 수렴하는 속도가 느려집니다(반대로 값이 작을수록 빨라짐).

가속 센서를 읽을 때 최대한 정확한 결과를 얻고 싶습니다. 어떻게 해야 하나요?

Input.acceleration 변수를 읽는 것은 하드웨어 샘플링과 동일하지 않습니다. 간단히 설명하자면 Unity는 하드웨어를 주파수 60Hz로 샘플링하고 그 결과를 변수에 저장합니다. 실제로는 CPU 부하가 클 경우 가속 센서 샘플링이 일정한 시간 간격으로 수행되지 않는다는 점에서 조금 더 복잡합니다. 따라서 시스템은 한 프레임 동안 2개의 샘플을 보고하고 다음 프레임 동안 1개의 샘플을 보고할 수 있습니다.

해당 프레임 동안 가속 센서로 실행된 모든 측정값에 액세스할 수 있습니다. 다음 코드는 마지막 프레임에서 수집된 모든 가속 센서 이벤트의 단순 평균을 나타냅니다.

public class AccelerationEvents : MonoBehaviour
{ 
    void Update()
    {
        GetAccelerometerValue();
    }

    Vector3 GetAccelerometerValue()
    {
        Vector3 acc = Vector3.zero;
        float period = 0.0f;

        foreach(AccelerationEvent evnt in Input.accelerationEvents)
        {
            acc += evnt.acceleration * evnt.deltaTime;
            period += evnt.deltaTime;
        }
        if (period > 0)
        {
            acc *= 1.0f / period;
        }
        return acc;
    }
}
입력 관리자
Unity의 IME