Input Manager
Mobil Keyboard

Masukan perangkat seluler

Pada perangkat seluler, kelas Input menawarkan akses ke layar sentuh, accelerometer dan input geografis /lokasi.

Akses ke keyboard pada perangkat seluler disediakan melalui iOS keyboard.

Layar multi sentuh

Perangkat sentuh iPhone, iPad dan iPod mampu melacak hingga lima jari menyentuh layar secara bersamaan. Anda dapat mengambil status setiap jari menyentuh layar selama bingkai terakhir dengan mengakses array properti Input.touches.

Perangkat Android tidak memiliki batas terpadu pada berapa banyak jari yang mereka lacak. Alih-alih, bervariasi dari perangkat ke perangkat dan dapat apa-apa dari dua sentuhan pada perangkat yang lebih tua hingga lima jari pada beberapa perangkat yang lebih baru.

Setiap sentuhan jari diwakili oleh struktur data Masukan.Touch:

Property: Description:
fingerId Indeks unik untuk sentuhan.
position Posisi layar sentuh.
deltaPosition Perubahan posisi layar sejak bingkai terakhir.
deltaTime Jumlah waktu yang telah berlalu sejak perubahan state terakhir.
tapCount Layar iPhone / iPad mampu membedakan keran jari cepat oleh pengguna. Counter ini akan memberi tahu Anda berapa kali pengguna telah mengetuk layar tanpa memindahkan jari ke sisi. Perangkat Android tidak menghitung jumlah keran, bidang ini selalu 1.
phase Jelaskan keadaan sentuhan, yang dapat membantu Anda menentukan apakah pengguna baru mulai menyentuh layar, hanya memindahkan jari mereka atau hanya mengangkat jari mereka.
Began Jari hanya menyentuh layar.
Moved Jari bergerak di layar.
Stationary Jari menyentuh layar tetapi belum pindah sejak bingkai terakhir.
Ended Jari diangkat dari layar. Ini adalah fase akhir dari sentuhan.
Canceled Sistem membatalkan pelacakan untuk sentuhan, seperti ketika (misalnya) pengguna menempatkan perangkat ke wajah mereka atau lebih dari lima sentuhan terjadi secara bersamaan. Ini adalah fase akhir dari sentuhan.

Berikut adalah contoh script yang menembak sinar setiap kali pengguna mengetuk di layar:

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

Simulasi Mouse

Di atas dukungan sentuhan asli Unity iOS / Android menyediakan simulasi mouse. Anda dapat menggunakan fungsi mouse dari kelas standar Input. Perhatikan bahwa perangkat iOS / Android dirancang untuk mendukung beberapa sentuhan jari. Menggunakan fungsi mouse akan mendukung hanya sentuhan jari tunggal. Juga, sentuhan jari pada perangkat mobile dapat bergerak dari satu daerah ke yang lain tanpa gerakan antara mereka. Mouse simulasi pada perangkat seluler akan memberikan gerakan, sehingga sangat berbeda dibandingkan dengan input sentuh. Rekomendasinya adalah untuk menggunakan simulasi mouse selama perkembangan awal tetapi untuk menggunakan input sentuh sesegera mungkin.

Accelerometer

Sebagai perangkat mobile bergerak, akselemeter built-in melaporkan perubahan akselerasi linier sepanjang tiga sumbu utama di ruang tiga dimensi. Percepatan di sepanjang setiap sumbu dilaporkan langsung oleh perangkat keras sebagai nilai-nilai G-force. Nilai 1.0 mewakili beban sekitar +1g sepanjang sumbu yang diberikan sementara nilai -1.0 mewakili -1g. Jika Anda memegang perangkat tegak (dengan tombol rumah di bagian bawah) di depan Anda, sumbu X positif sepanjang kanan, sumbu Y positif langsung, dan sumbu Z adalah titik positif menuju Anda.

Anda dapat mengambil nilai accelerometer dengan mengakses properti Input.acceleration.

Berikut adalah contoh script yang akan memindahkan objek menggunakan accelerometer:

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

Filter Low-Pass

Pembacaan Accelerometer dapat dijerky dan noisy. Menerapkan penyaringan rendah-pass pada sinyal memungkinkan Anda untuk menghaluskan dan menyingkirkan kebisingan frekuensi tinggi.

Skrip berikut menunjukkan cara menerapkan penyaringan rendah untuk pembacaan accelerometer:

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

Semakin besar nilai LowPassKernelWidthInSeconds, semakin lambat nilai yang disaring akan meyakinkan terhadap sampel input saat ini (dan sebaliknya).

Saya ingin banyak ketepatan mungkin ketika membaca accelerometer. Apa yang harus saya lakukan?

Membaca variabel Input.acceleration tidak sama pengambilan sampel perangkat keras. Masukkan hanya, sampel Unity perangkat keras pada frekuensi 60Hz dan menyimpan hasilnya ke dalam variabel. Kenyataan, hal-hal sedikit lebih rumit - pengambilan sampel accelerometer tidak terjadi pada interval waktu yang konsisten, jika di bawah beban CPU yang signifikan. Akibatnya, sistem mungkin melaporkan 2 sampel selama satu bingkai, maka 1 sampel selama bingkai berikutnya.

Anda dapat mengakses semua pengukuran yang dieksekusi oleh accelerometer selama bingkai. Kode berikut akan menggambarkan rata-rata sederhana dari semua peristiwa accelerometer yang dikumpulkan dalam bingkai terakhir:

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;
    }
}
Input Manager
Mobil Keyboard