Bagikan melalui


Dasar-Dasar HoloLens (generasi ke-1) 101E: Menyelesaikan proyek dengan emulator

Penting

Tutorial Mixed Reality Academy dirancang dengan ingat HoloLens (generasi ke-1), Unity 2017, dan Mixed Reality Immersive Headsets. Dengan demikian, kami merasa penting untuk meninggalkan tutorial ini di tempat bagi pengembang yang masih mencari panduan dalam mengembangkan untuk perangkat tersebut. Tutorial ini tidak akan diperbarui dengan toolset atau interaksi terbaru yang digunakan untuk HoloLens 2 dan mungkin tidak kompatibel dengan versi Unity yang lebih baru. Mereka akan dipertahankan untuk terus bekerja pada perangkat yang didukung. Serangkaian tutorial baru telah diposting untuk HoloLens 2.


Tutorial ini akan memandu Anda melalui proyek lengkap, dibangun di Unity, yang menunjukkan fitur Windows Mixed Reality inti pada HoloLens termasuk tatapan, gerakan, input suara, suara spasial, dan pemetaan spasial. Tutorial ini akan memakan waktu sekitar 1 jam untuk menyelesaikannya.

Dukungan perangkat

Kursus HoloLens Headset imersif
MR Basics 101E: Menyelesaikan proyek dengan emulator ✔️

Sebelum memulai

Prasyarat

  • PC Windows 10 dikonfigurasi dengan alat yang benar terinstal.

File proyek

  • Unduh file yang diperlukan oleh proyek. Memerlukan Unity 2017.2 atau yang lebih baru.
    • Jika Anda masih memerlukan dukungan Unity 5.6, silakan gunakan rilis ini.
    • Jika Anda masih memerlukan dukungan Unity 5.5, silakan gunakan rilis ini.
    • Jika Anda masih memerlukan dukungan Unity 5.4, silakan gunakan rilis ini.
  • Batalkan arsip file ke desktop Anda atau lokasi lain yang mudah dijangkau. Pertahankan nama folder sebagai Origami.

Catatan

Jika Anda ingin melihat melalui kode sumber sebelum mengunduh, kode tersebut tersedia di GitHub.

Bab 1 - Dunia "Holo"

Dalam bab ini, kita akan menyiapkan proyek Unity pertama kita dan menelusuri proses build dan deploy.

Tujuan

  • Siapkan Unity untuk pengembangan holografik.
  • Membuat hologram.
  • Lihat hologram yang Anda buat.

Petunjuk

  • Mulai Unity.
  • Pilih Buka.
  • Masukkan lokasi sebagai folder Origami yang sebelumnya tidak Anda arsipkan.
  • Pilih Origami dan klik Pilih Folder.
  • Simpan adegan baru: Simpan Adegan Sebagai File / .
  • Beri nama adegan Origami dan tekan tombol Simpan .

Menyiapkan kamera utama

  • Di Panel Hierarki, pilih Kamera Utama.
  • Di Inspektur atur posisi transformasinya menjadi 0,0,0.
  • Temukan properti Hapus Bendera , dan ubah menu dropdown dari Skybox menjadi Warna solid.
  • Klik bidang Latar Belakang untuk membuka pemilih warna.
  • Atur R, G, B, dan A ke 0.

Menyiapkan adegan

  • Di Panel Hierarki, klik Buat dan Buat Kosong.
  • Klik kanan GameObject baru dan pilih Ganti Nama. Ganti nama GameObject menjadi OrigamiCollection.
  • Dari folder Hologram di Panel Proyek:
    • Seret Tahap ke dalam Hierarki untuk menjadi anak dari OrigamiCollection.
    • Seret Sphere1 ke dalam Hierarki untuk menjadi anak dari OrigamiCollection.
    • Seret Sphere2 ke dalam Hierarki untuk menjadi anak dari OrigamiCollection.
  • Klik kanan objek Cahaya Arah di Panel Hierarki dan pilih Hapus.
  • Dari folder Hologram , seret Lampu ke akar Panel Hierarki.
  • Di Hierarki, pilih OrigamiCollection.
  • Di Inspektur, atur posisi transformasi ke 0, -0,5, 2.0.
  • Tekan tombol Putar di Unity untuk mempratinjau hologram Anda.
  • Anda akan melihat objek Origami di jendela pratinjau.
  • Tekan Putar untuk kedua kalinya untuk menghentikan mode pratinjau.

Mengekspor proyek dari Unity ke Visual Studio

  • Di Unity pilih Pengaturan Build File>.
  • Pilih Windows Store di daftar Platform dan klik Beralih Platform.
  • Atur SDK ke Universal 10 dan Jenis Build ke D3D.
  • Periksa Proyek Unity C#.
  • Klik Tambahkan Adegan Terbuka untuk menambahkan adegan.
  • Klik Pengaturan Pemutar....
  • Di Panel Pemeriksa pilih logo Bursa Windows. Lalu pilih Pengaturan Penerbitan.
  • Di bagian Kemampuan , pilih kemampuan Mikrofon dan SpasialPerception .
  • Kembali ke jendela Pengaturan Build, klik Bangun.
  • Buat Folder Baru bernama "Aplikasi".
  • Klik tunggal Folder Aplikasi.
  • Tekan Pilih Folder.
  • Ketika Unity selesai, jendela File Explorer akan muncul.
  • Buka folder Aplikasi .
  • Buka Solusi Origami Visual Studio.
  • Menggunakan toolbar atas di Visual Studio, ubah target dari Debug ke Rilis dan dari ARM ke X86.
    • Klik panah di samping tombol Perangkat, dan pilih Emulator HoloLens.
    • Klik Debug -> Mulai Tanpa penelusuran kesalahan atau tekan Ctrl + F5.
    • Setelah beberapa waktu emulator akan dimulai dengan proyek Origami. Saat pertama kali meluncurkan emulator, dibutuhkan waktu selama 15 menit agar emulator dimulai. Setelah dimulai, jangan tutup.

Bab 2 - Tatapan

Dalam bab ini, kita akan memperkenalkan yang pertama dari tiga cara berinteraksi dengan hologram Anda - tatapan.

Tujuan

  • Visualisasikan tatapan Anda menggunakan kursor yang terkunci di dunia.

Petunjuk

  • Kembali ke proyek Unity Anda, dan tutup jendela Pengaturan Build jika masih terbuka.
  • Pilih folder Hologram di panel Proyek.
  • Seret objek Kursor ke panel Hierarki di tingkat akar.
  • Klik dua kali pada objek Kursor untuk melihatnya lebih dekat.
  • Klik kanan pada folder Skrip di panel Proyek.
  • Klik sub-menu Buat .
  • Pilih Skrip C#.
  • Beri nama skrip WorldCursor. Catatan: Namanya peka huruf besar/kecil. Anda tidak perlu menambahkan ekstensi .cs.
  • Pilih objek Kursor di panel Hierarki.
  • Seret dan letakkan skrip WorldCursor ke panel Inspektur.
  • Klik dua kali skrip WorldCursor untuk membukanya di Visual Studio.
  • Salin dan tempel kode ini ke WorldCursor.cs dan Simpan Semua.
using UnityEngine;

public class WorldCursor : MonoBehaviour
{
    private MeshRenderer meshRenderer;

    // Use this for initialization
    void Start()
    {
        // Grab the mesh renderer that's on the same object as this script.
        meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        // Do a raycast into the world based on the user's
        // head position and orientation.
        var headPosition = Camera.main.transform.position;
        var gazeDirection = Camera.main.transform.forward;

        RaycastHit hitInfo;

        if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
        {
            // If the raycast hit a hologram...
            // Display the cursor mesh.
            meshRenderer.enabled = true;

            // Move thecursor to the point where the raycast hit.
            this.transform.position = hitInfo.point;

            // Rotate the cursor to hug the surface of the hologram.
            this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
        }
        else
        {
            // If the raycast did not hit a hologram, hide the cursor mesh.
            meshRenderer.enabled = false;
        }
    }
}
  • Bangun ulang aplikasi dari Pengaturan Build File>.
  • Kembali ke solusi Visual Studio yang sebelumnya digunakan untuk menyebarkan ke emulator.
  • Pilih 'Muat Ulang Semua' saat diminta.
  • Klik Debug -> Mulai Tanpa penelusuran kesalahan atau tekan Ctrl + F5.
  • Gunakan pengontrol Xbox untuk melihat-lihat adegan. Perhatikan bagaimana kursor berinteraksi dengan bentuk objek.

Bab 3 - Gerakan

Dalam bab ini, kami akan menambahkan dukungan untuk gerakan. Ketika pengguna memilih bola kertas, kita akan membuat bola jatuh dengan menyalakan gravitasi menggunakan mesin fisika Unity.

Tujuan

  • Kontrol hologram Anda dengan gerakan Pilih.

Petunjuk

Kita akan mulai dengan membuat skrip daripada dapat mendeteksi gerakan Pilih.

  • Di folder Skrip , buat skrip bernama GazeGestureManager.
  • Seret skrip GazeGestureManager ke objek OrigamiCollection di Hierarki.
  • Buka skrip GazeGestureManager di Visual Studio dan tambahkan kode berikut:
using UnityEngine;
using UnityEngine.XR.WSA.Input;

public class GazeGestureManager : MonoBehaviour
{
    public static GazeGestureManager Instance { get; private set; }

    // Represents the hologram that is currently being gazed at.
    public GameObject FocusedObject { get; private set; }

    GestureRecognizer recognizer;

    // Use this for initialization
    void Start()
    {
        Instance = this;

        // Set up a GestureRecognizer to detect Select gestures.
        recognizer = new GestureRecognizer();
        recognizer.Tapped += (args) =>
        {
            // Send an OnSelect message to the focused object and its ancestors.
            if (FocusedObject != null)
            {
                FocusedObject.SendMessageUpwards("OnSelect", SendMessageOptions.DontRequireReceiver);
            }
        };
        recognizer.StartCapturingGestures();
    }

    // Update is called once per frame
    void Update()
    {
        // Figure out which hologram is focused this frame.
        GameObject oldFocusObject = FocusedObject;

        // Do a raycast into the world based on the user's
        // head position and orientation.
        var headPosition = Camera.main.transform.position;
        var gazeDirection = Camera.main.transform.forward;

        RaycastHit hitInfo;
        if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
        {
            // If the raycast hit a hologram, use that as the focused object.
            FocusedObject = hitInfo.collider.gameObject;
        }
        else
        {
            // If the raycast did not hit a hologram, clear the focused object.
            FocusedObject = null;
        }

        // If the focused object changed this frame,
        // start detecting fresh gestures again.
        if (FocusedObject != oldFocusObject)
        {
            recognizer.CancelGestures();
            recognizer.StartCapturingGestures();
        }
    }
}
  • Buat skrip lain di folder Skrip, kali ini bernama SphereCommands.
  • Perluas objek OrigamiCollection dalam tampilan Hierarki.
  • Seret skrip SphereCommands ke objek Sphere1 di panel Hierarki.
  • Seret skrip SphereCommands ke objek Sphere2 di panel Hierarki.
  • Buka skrip di Visual Studio untuk pengeditan, dan ganti kode default dengan ini:
using UnityEngine;

public class SphereCommands : MonoBehaviour
{
    // Called by GazeGestureManager when the user performs a Select gesture
    void OnSelect()
    {
        // If the sphere has no Rigidbody component, add one to enable physics.
        if (!this.GetComponent<Rigidbody>())
        {
            var rigidbody = this.gameObject.AddComponent<Rigidbody>();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }
}
  • Ekspor, bangun, dan sebarkan aplikasi ke emulator HoloLens.
  • Lihatlah sekitar TKP, dan tengah pada salah satu bola.
  • Tekan tombol A pada pengontrol Xbox atau tekan Spasi untuk mensimulasikan gerakan Pilih.

Bab 4 - Suara

Dalam bab ini, kita akan menambahkan dukungan untuk dua perintah suara: "Reset dunia" untuk mengembalikan bola yang dijatuhkan ke lokasi aslinya, dan "Jatuhkan bola" untuk membuat bola jatuh.

Tujuan

  • Tambahkan perintah suara yang selalu mendengarkan di latar belakang.
  • Buat hologram yang bereaksi terhadap perintah suara.

Petunjuk

  • Di folder Skrip , buat skrip bernama SpeechManager.
  • Seret skrip SpeechManager ke objek OrigamiCollection di Hierarki
  • Buka skrip SpeechManager di Visual Studio.
  • Salin dan tempel kode ini ke SpeechManager.cs dan Simpan Semua:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Windows.Speech;

public class SpeechManager : MonoBehaviour
{
    KeywordRecognizer keywordRecognizer = null;
    Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

    // Use this for initialization
    void Start()
    {
        keywords.Add("Reset world", () =>
        {
            // Call the OnReset method on every descendant object.
            this.BroadcastMessage("OnReset");
        });

        keywords.Add("Drop Sphere", () =>
        {
            var focusObject = GazeGestureManager.Instance.FocusedObject;
            if (focusObject != null)
            {
                // Call the OnDrop method on just the focused object.
                focusObject.SendMessage("OnDrop", SendMessageOptions.DontRequireReceiver);
            }
        });

        // Tell the KeywordRecognizer about our keywords.
        keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

        // Register a callback for the KeywordRecognizer and start recognizing!
        keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
        keywordRecognizer.Start();
    }

    private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
    {
        System.Action keywordAction;
        if (keywords.TryGetValue(args.text, out keywordAction))
        {
            keywordAction.Invoke();
        }
    }
}
  • Buka skrip SphereCommands di Visual Studio.
  • Perbarui skrip untuk dibaca sebagai berikut:
using UnityEngine;

public class SphereCommands : MonoBehaviour
{
    Vector3 originalPosition;

    // Use this for initialization
    void Start()
    {
        // Grab the original local position of the sphere when the app starts.
        originalPosition = this.transform.localPosition;
    }

    // Called by GazeGestureManager when the user performs a Select gesture
    void OnSelect()
    {
        // If the sphere has no Rigidbody component, add one to enable physics.
        if (!this.GetComponent<Rigidbody>())
        {
            var rigidbody = this.gameObject.AddComponent<Rigidbody>();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }

    // Called by SpeechManager when the user says the "Reset world" command
    void OnReset()
    {
        // If the sphere has a Rigidbody component, remove it to disable physics.
        var rigidbody = this.GetComponent<Rigidbody>();
        if (rigidbody != null)
        {
            rigidbody.isKinematic = true;
            Destroy(rigidbody);
        }

        // Put the sphere back into its original local position.
        this.transform.localPosition = originalPosition;
    }

    // Called by SpeechManager when the user says the "Drop sphere" command
    void OnDrop()
    {
        // Just do the same logic as a Select gesture.
        OnSelect();
    }
}
  • Ekspor, bangun, dan sebarkan aplikasi ke emulator HoloLens.
  • Emulator akan mendukung mikrofon PC Anda dan merespons suara Anda: sesuaikan tampilan sehingga kursor berada di salah satu bola, dan ucapkan "Drop Sphere".
  • Katakan "Reset Dunia" untuk membawa mereka kembali ke posisi awal mereka.

Bab 5 - Suara spasial

Dalam bab ini, kita akan menambahkan musik ke aplikasi, lalu memicu efek suara pada tindakan tertentu. Kita akan menggunakan suara spasial untuk memberikan suara lokasi tertentu di ruang 3D.

Tujuan

  • Dengarkan hologram di duniamu.

Petunjuk

  • Di unity pilih dari menu atas Edit > Audio Pengaturan > Proyek
  • Temukan pengaturan Plugin Spatializer dan pilih MS HRTF Spatializer.
  • Dari folder Hologram , seret objek Ambience ke objek OrigamiCollection di Panel Hierarki.
  • Pilih OrigamiCollection dan temukan komponen Sumber Audio . Ubah properti ini:
    • Periksa properti Spasialisasi .
    • Periksa Play On Awake.
    • Ubah Campuran Spasial menjadi 3D dengan menyeret penggeser ke kanan.
    • Periksa properti Perulangan .
    • Perluas Pengaturan Suara 3D, dan masukkan 0.1 untuk Tingkat Doppler.
    • Atur Rolloff Volume ke Rolloff Logaritmik.
    • Atur Jarak Maks ke 20.
  • Di folder Skrip , buat skrip bernama SphereSounds.
  • Seret SphereSounds ke objek Sphere1 dan Sphere2 di Hierarki.
  • Buka SphereSounds di Visual Studio, perbarui kode berikut dan Simpan Semua.
using UnityEngine;

public class SphereSounds : MonoBehaviour
{
    AudioSource impactAudioSource = null;
    AudioSource rollingAudioSource = null;

    bool rolling = false;

    void Start()
    {
        // Add an AudioSource component and set up some defaults
        impactAudioSource = gameObject.AddComponent<AudioSource>();
        impactAudioSource.playOnAwake = false;
        impactAudioSource.spatialize = true;
        impactAudioSource.spatialBlend = 1.0f;
        impactAudioSource.dopplerLevel = 0.0f;
        impactAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
        impactAudioSource.maxDistance = 20f;

        rollingAudioSource = gameObject.AddComponent<AudioSource>();
        rollingAudioSource.playOnAwake = false;
        rollingAudioSource.spatialize = true;
        rollingAudioSource.spatialBlend = 1.0f;
        rollingAudioSource.dopplerLevel = 0.0f;
        rollingAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
        rollingAudioSource.maxDistance = 20f;
        rollingAudioSource.loop = true;

        // Load the Sphere sounds from the Resources folder
        impactAudioSource.clip = Resources.Load<AudioClip>("Impact");
        rollingAudioSource.clip = Resources.Load<AudioClip>("Rolling");
    }

    // Occurs when this object starts colliding with another object
    void OnCollisionEnter(Collision collision)
    {
        // Play an impact sound if the sphere impacts strongly enough.
        if (collision.relativeVelocity.magnitude >= 0.1f)
        {
            impactAudioSource.Play();
        }
    }

    // Occurs each frame that this object continues to collide with another object
    void OnCollisionStay(Collision collision)
    {
        Rigidbody rigid = gameObject.GetComponent<Rigidbody>();

        // Play a rolling sound if the sphere is rolling fast enough.
        if (!rolling && rigid.velocity.magnitude >= 0.01f)
        {
            rolling = true;
            rollingAudioSource.Play();
        }
        // Stop the rolling sound if rolling slows down.
        else if (rolling && rigid.velocity.magnitude < 0.01f)
        {
            rolling = false;
            rollingAudioSource.Stop();
        }
    }

    // Occurs when this object stops colliding with another object
    void OnCollisionExit(Collision collision)
    {
        // Stop the rolling sound if the object falls off and stops colliding.
        if (rolling)
        {
            rolling = false;
            impactAudioSource.Stop();
            rollingAudioSource.Stop();
        }
    }
}
  • Simpan skrip, dan kembali ke Unity.
  • Ekspor, bangun, dan sebarkan aplikasi ke emulator HoloLens.
  • Kenakan headphone untuk mendapatkan efek penuh, dan bergerak lebih dekat dan lebih jauh dari Panggung untuk mendengar suara berubah.

Bab 6 - Pemetaan spasial

Sekarang kita akan menggunakan pemetaan spasial untuk menempatkan papan permainan pada objek nyata di dunia nyata.

Tujuan

  • Bawa dunia nyata Anda ke dunia virtual.
  • Tempatkan hologram Anda di mana mereka sangat penting bagi Anda.

Petunjuk

  • Klik folder Hologram di panel Proyek.
  • Seret aset Pemetaan Spasial ke akar Hierarki.
  • Klik objek Pemetaan Spasial di Hierarki.
  • Di panel Inspektur, ubah properti berikut:
    • Centang kotak Gambar Jala Visual .
    • Temukan Gambar Bahan dan klik lingkaran di sebelah kanan. Ketik "wireframe" ke bidang pencarian di bagian atas. Klik hasilnya lalu tutup jendela.
  • Ekspor, bangun, dan sebarkan aplikasi ke emulator HoloLens.
  • Ketika aplikasi berjalan, jala ruang tamu dunia nyata yang sebelumnya dipindai akan dirender dalam bingkai kawat.
  • Perhatikan bagaimana bola bergulir akan jatuh dari panggung, dan ke lantai!

Sekarang kami akan menunjukkan kepada Anda cara memindahkan OrigamiCollection ke lokasi baru:

  • Di folder Skrip , buat skrip bernama TapToPlaceParent.
  • Dalam Hierarki, perluas OrigamiCollection dan pilih objek Tahap .
  • Seret skrip TapToPlaceParent ke objek Tahap.
  • Buka skrip TapToPlaceParent di Visual Studio, dan perbarui menjadi yang berikut ini:
using UnityEngine;

public class TapToPlaceParent : MonoBehaviour
{
    bool placing = false;

    // Called by GazeGestureManager when the user performs a Select gesture
    void OnSelect()
    {
        // On each Select gesture, toggle whether the user is in placing mode.
        placing = !placing;

        // If the user is in placing mode, display the spatial mapping mesh.
        if (placing)
        {
            SpatialMapping.Instance.DrawVisualMeshes = true;
        }
        // If the user is not in placing mode, hide the spatial mapping mesh.
        else
        {
            SpatialMapping.Instance.DrawVisualMeshes = false;
        }
    }

    // Update is called once per frame
    void Update()
    {
        // If the user is in placing mode,
        // update the placement to match the user's gaze.

        if (placing)
        {
            // Do a raycast into the world that will only hit the Spatial Mapping mesh.
            var headPosition = Camera.main.transform.position;
            var gazeDirection = Camera.main.transform.forward;

            RaycastHit hitInfo;
            if (Physics.Raycast(headPosition, gazeDirection, out hitInfo,
                30.0f, SpatialMapping.PhysicsRaycastMask))
            {
                // Move this object's parent object to
                // where the raycast hit the Spatial Mapping mesh.
                this.transform.parent.position = hitInfo.point;

                // Rotate this object's parent object to face the user.
                Quaternion toQuat = Camera.main.transform.localRotation;
                toQuat.x = 0;
                toQuat.z = 0;
                this.transform.parent.rotation = toQuat;
            }
        }
    }
}
  • Ekspor, bangun, dan sebarkan aplikasi.
  • Sekarang Anda sekarang dapat menempatkan permainan di lokasi tertentu dengan menatapnya, menggunakan gerakan Pilih (A atau Spasi) dan kemudian pindah ke lokasi baru, dan menggunakan gerakan Pilih lagi.

Akhir

Dan itulah akhir tutorial ini!

Anda belajar:

  • Cara membuat aplikasi holografik di Unity.
  • Cara memanfaatkan tatapan, gerakan, suara, suara, dan pemetaan spasial.
  • Cara membuat dan menyebarkan aplikasi menggunakan Visual Studio.

Anda sekarang siap untuk mulai membuat aplikasi holografik Anda sendiri!

Lihat juga