HoloLens (generasi ke-1) dan Azure 312: Integrasi bot
Catatan
Tutorial Mixed Reality Academy dirancang dengan HoloLens (generasi ke-1) dan Mixed Reality Immersive Headsets dalam pikiran. 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. Mereka akan dipertahankan untuk terus bekerja pada perangkat yang didukung. Akan ada serangkaian tutorial baru yang akan diposting di masa depan yang akan menunjukkan cara mengembangkan untuk HoloLens 2. Pemberitahuan ini akan diperbarui dengan tautan ke tutorial tersebut ketika diposting.
Dalam kursus ini, Anda akan mempelajari cara membuat dan menyebarkan bot menggunakan Microsoft Bot Framework V4 dan berkomunikasi dengannya melalui aplikasi Windows Mixed Reality.
Microsoft Bot Framework V4 adalah sekumpulan API yang dirancang untuk menyediakan alat kepada pengembang untuk membangun aplikasi bot yang dapat diperluas dan dapat diskalakan. Untuk informasi selengkapnya, kunjungi halaman Microsoft Bot Framework atau Repositori Git V4.
Setelah menyelesaikan kursus ini, Anda akan membangun aplikasi Windows Mixed Reality, yang akan dapat melakukan hal berikut:
- Gunakan Ketuk Gerakan untuk memulai bot yang mendengarkan suara pengguna.
- Ketika pengguna telah mengatakan sesuatu, bot akan mencoba memberikan respons.
- Tampilkan balasan bot sebagai teks, diposisikan di dekat bot, di Adegan Unity.
Dalam aplikasi Anda, terserah Anda tentang bagaimana Anda akan mengintegrasikan hasilnya dengan desain Anda. Kursus ini dirancang untuk mengajari Anda cara mengintegrasikan Layanan Azure dengan proyek Unity Anda. Ini adalah tugas Anda untuk menggunakan pengetahuan yang Anda peroleh dari kursus ini untuk meningkatkan aplikasi realitas campuran Anda.
Dukungan perangkat
Kursus | HoloLens | Headset imersif |
---|---|---|
MR dan Azure 312: Integrasi bot | ✔️ | ✔️ |
Catatan
Meskipun kursus ini terutama berfokus pada HoloLens, Anda juga dapat menerapkan apa yang Anda pelajari dalam kursus ini ke headset imersif (VR) Windows Mixed Reality. Karena headset imersif (VR) tidak memiliki kamera yang dapat diakses, Anda akan memerlukan kamera eksternal yang terhubung ke PC Anda. Saat mengikuti kursus, Anda akan melihat catatan tentang perubahan apa pun yang mungkin perlu Anda gunakan untuk mendukung headset imersif (VR).
Prasyarat
Catatan
Tutorial ini dirancang untuk pengembang yang memiliki pengalaman dasar dengan Unity dan C#. Perlu diketahui juga bahwa prasyarat dan instruksi tertulis dalam dokumen ini mewakili apa yang telah diuji dan diverifikasi pada saat penulisan (Juli 2018). Anda bebas menggunakan perangkat lunak terbaru, seperti yang tercantum dalam artikel instal alat , meskipun tidak boleh diasumsikan bahwa informasi dalam kursus ini akan sangat cocok dengan apa yang akan Anda temukan di perangkat lunak yang lebih baru daripada apa yang tercantum di bawah ini.
Kami merekomendasikan perangkat keras dan perangkat lunak berikut untuk kursus ini:
- PC pengembangan, kompatibel dengan Windows Mixed Reality untuk pengembangan headset imersif (VR)
- Pembaruan Windows 10 Fall Creators (atau yang lebih baru) dengan mode Pengembang diaktifkan
- Windows 10 SDK terbaru
- Unity 2017.4
- Visual Studio 2017
- Headset Windows Mixed Reality immersive (VR) atau Microsoft HoloLens dengan mode Pengembang diaktifkan
- Akses internet untuk Azure, dan untuk pengambilan Azure Bot. Untuk informasi lebih lanjut, silakan ikuti tautan ini.
Sebelum memulai
- Untuk menghindari masalah saat membangun proyek ini, sangat disarankan agar Anda membuat proyek yang disebutkan dalam tutorial ini di folder root atau near-root (jalur folder panjang dapat menyebabkan masalah pada build-time).
- Siapkan dan uji HoloLens Anda. Jika Anda memerlukan dukungan untuk menyiapkan HoloLens Anda, pastikan untuk mengunjungi artikel penyiapan HoloLens.
- Sebaiknya lakukan Kalibrasi dan Penyetelan Sensor saat mulai mengembangkan aplikasi HoloLens baru (terkadang dapat membantu melakukan tugas tersebut untuk setiap pengguna).
Untuk bantuan tentang Kalibrasi, silakan ikuti tautan ini ke artikel Kalibrasi HoloLens.
Untuk bantuan tentang Penyetelan Sensor, silakan ikuti tautan ini ke artikel Penyetelan Sensor HoloLens.
Bab 1 – Buat aplikasi Bot
Langkah pertama adalah membuat bot Anda sebagai aplikasi Web ASP.Net Core lokal. Setelah selesai dan mengujinya, Anda akan menerbitkannya ke Portal Microsoft Azure.
Buka Visual Studio. Buat proyek baru, pilih Aplikasi Web ASP NET Core sebagai jenis proyek (Anda akan menemukannya di bawah subbagian .NET Core) dan sebut saja MyBot. Klik OK.
Di Jendela yang akan muncul pilih Kosong. Pastikan juga target diatur ke ASP NET Core 2.0 dan Autentikasi diatur ke Tanpa Autentikasi. Klik OK.
Solusinya sekarang akan terbuka. Klik kanan pada Solution Mybot di Penjelajah Solusi dan klik Kelola Paket NuGet untuk Solusi.
Di tab Telusuri , cari Microsoft.Bot.Builder.Integration.AspNet.Core (pastikan Anda telah memeriksa Sertakan pra-rilis ). Pilih paket versi 4.0.1-preview, dan centang kotak proyek. Kemudian klik Instal. Anda sekarang telah menginstal pustaka yang diperlukan untuk Bot Framework v4. Tutup halaman NuGet.
Klik kanan proyek Anda, MyBot, di Penjelajah Solusi dan klik Tambahkan | Kelas.
Beri nama kelas MyBot dan klik Tambahkan.
Ulangi poin sebelumnya, untuk membuat kelas lain bernama ConversationContext.
Klik kanan wwwroot di Penjelajah Solusi dan klik Tambahkan | Item Baru. Pilih Halaman HTML (Anda akan menemukannya di bawah Web sub-bagian). Beri nama file default.html. Klik Tambahkan.
Daftar kelas/objek dalam Penjelajah Solusi akan terlihat seperti gambar di bawah ini.
Klik dua kali pada kelas ConversationContext . Kelas ini bertanggung jawab untuk menahan variabel yang digunakan oleh bot untuk mempertahankan konteks percakapan. Nilai konteks percakapan ini dipertahankan dalam instans kelas ini, karena instans kelas MyBot apa pun akan di-refresh setiap kali aktivitas diterima. Tambahkan kode berikut ke kelas :
namespace MyBot { public static class ConversationContext { internal static string userName; internal static string userMsg; } }
Klik dua kali pada kelas MyBot . Kelas ini akan menghosting handler yang dipanggil oleh aktivitas masuk apa pun dari pelanggan. Di kelas ini Anda akan menambahkan kode yang digunakan untuk membangun percakapan antara bot dan pelanggan. Seperti disebutkan sebelumnya, instans kelas ini diinisialisasi setiap kali aktivitas diterima. Tambahkan kode berikut ke kelas ini:
using Microsoft.Bot; using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; using System.Threading.Tasks; namespace MyBot { public class MyBot : IBot { public async Task OnTurn(ITurnContext context) { ConversationContext.userMsg = context.Activity.Text; if (context.Activity.Type is ActivityTypes.Message) { if (string.IsNullOrEmpty(ConversationContext.userName)) { ConversationContext.userName = ConversationContext.userMsg; await context.SendActivity($"Hello {ConversationContext.userName}. Looks like today it is going to rain. \nLuckily I have umbrellas and waterproof jackets to sell!"); } else { if (ConversationContext.userMsg.Contains("how much")) { if (ConversationContext.userMsg.Contains("umbrella")) await context.SendActivity($"Umbrellas are $13."); else if (ConversationContext.userMsg.Contains("jacket")) await context.SendActivity($"Waterproof jackets are $30."); else await context.SendActivity($"Umbrellas are $13. \nWaterproof jackets are $30."); } else if (ConversationContext.userMsg.Contains("color") || ConversationContext.userMsg.Contains("colour")) { await context.SendActivity($"Umbrellas are black. \nWaterproof jackets are yellow."); } else { await context.SendActivity($"Sorry {ConversationContext.userName}. I did not understand the question"); } } } else { ConversationContext.userMsg = string.Empty; ConversationContext.userName = string.Empty; await context.SendActivity($"Welcome! \nI am the Weather Shop Bot \nWhat is your name?"); } } } }
Klik dua kali pada kelas Startup . Kelas ini akan menginisialisasi bot. Tambahkan kode berikut ke kelas :
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Bot.Builder.BotFramework; using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace MyBot { public class Startup { public IConfiguration Configuration { get; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddSingleton(_ => Configuration); services.AddBot<MyBot>(options => { options.CredentialProvider = new ConfigurationCredentialProvider(Configuration); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseDefaultFiles(); app.UseStaticFiles(); app.UseBotFramework(); } } }
Buka file kelas Program dan verifikasi kode di dalamnya sama dengan yang berikut ini:
using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; namespace MyBot { public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build(); } }
Ingatlah untuk menyimpan perubahan Anda, untuk melakukannya, buka Simpan Semua File>, dari toolbar di bagian atas Visual Studio.
Bab 2 - Membuat Azure Bot Service
Sekarang setelah Anda membuat kode untuk bot, Anda harus menerbitkannya ke instans Web App Bot Service, di Portal Microsoft Azure. Bab ini akan menunjukkan kepada Anda cara membuat dan mengonfigurasi Bot Service di Azure lalu menerbitkan kode Anda ke dalamnya.
Pertama, masuk ke Portal Microsoft Azure (https://portal.azure.com).
- Jika Anda belum memiliki akun Azure, Anda harus membuatnya. Jika Anda mengikuti tutorial ini dalam situasi ruang kelas atau lab, mintalah instruktur atau salah satu proktor untuk membantu menyiapkan akun baru Anda.
Setelah Anda masuk, klik Buat sumber daya di sudut kiri atas, dan cari bot Aplikasi Web, dan klik Enter.
Halaman baru akan memberikan deskripsi Layanan Bot Aplikasi Web. Di kiri bawah halaman ini, pilih tombol Buat , untuk membuat asosiasi dengan Layanan ini.
Setelah Anda mengklik Buat:
Sisipkan Nama yang Anda inginkan untuk instans Layanan ini.
Pilih Langganan.
Pilih Grup Sumber Daya atau buat yang baru. Grup sumber daya menyediakan cara untuk memantau, mengontrol akses, menyediakan, dan mengelola penagihan untuk kumpulan aset Azure. Disarankan untuk menyimpan semua Layanan Azure yang terkait dengan satu proyek (misalnya seperti kursus ini) di bawah grup sumber daya umum).
Jika Anda ingin membaca selengkapnya tentang Grup Sumber Daya Azure, silakan ikuti tautan ini
Tentukan Lokasi untuk grup sumber daya Anda (jika Anda membuat Grup Sumber Daya baru). Lokasi idealnya akan berada di wilayah tempat aplikasi akan berjalan. Beberapa aset Azure hanya tersedia di wilayah tertentu.
Pilih Tingkat Harga yang sesuai untuk Anda, jika ini pertama kalinya membuat Layanan Bot Aplikasi Web, tingkat gratis (bernama F0) harus tersedia untuk Anda
Nama aplikasi hanya dapat dibiarkan sama dengan nama Bot.
Biarkan templat Bot sebagai Dasar (C#).
Paket layanan aplikasi/Lokasi seharusnya telah diisi secara otomatis untuk akun Anda.
Atur Azure Storage yang ingin Anda gunakan untuk menghosting Bot Anda. Jika Anda belum memilikinya, Anda dapat membuatnya di sini.
Anda juga perlu mengonfirmasi bahwa Anda telah memahami Syarat dan Ketentuan yang diterapkan pada Layanan ini.
Klik Buat.
Setelah mengklik Buat, Anda harus menunggu Layanan dibuat, ini mungkin memakan waktu satu menit.
Pemberitahuan akan muncul di Portal setelah instans Layanan dibuat.
Klik pemberitahuan untuk menjelajahi instans Layanan baru Anda.
Klik tombol Buka sumber daya di pemberitahuan untuk menjelajahi instans Layanan baru Anda. Anda akan dibawa ke instans Azure Service baru Anda.
Pada titik ini Anda perlu menyiapkan fitur yang disebut Direct Line untuk memungkinkan aplikasi klien Anda berkomunikasi dengan Bot Service ini. Klik Saluran, lalu di bagian Tambahkan saluran unggulan, klik Konfigurasikan saluran Direct Line.
Di halaman ini Anda akan menemukan kunci Rahasia yang akan memungkinkan aplikasi klien Anda untuk mengautentikasi dengan bot. Klik tombol Tampilkan dan ambil salinan salah satu Kunci yang ditampilkan, karena Anda akan membutuhkannya nanti dalam proyek Anda.
Bab 3 – Menerbitkan Bot ke Azure Web App Bot Service
Sekarang setelah Layanan Anda siap, Anda perlu menerbitkan kode Bot, yang Anda buat sebelumnya, ke Web App Bot Service yang baru dibuat.
Catatan
Anda harus menerbitkan Bot Anda ke Layanan Azure setiap kali Anda membuat perubahan pada solusi / kode Bot.
Kembali ke Solusi Visual Studio yang Anda buat sebelumnya.
Klik kanan pada proyek MyBot Anda, di Penjelajah Solusi, lalu klik Terbitkan.
Pada halaman Pilih target penerbitan, klik App Service, lalu Pilih Yang Sudah Ada, terakhir klik Buat Profil (Anda mungkin perlu mengklik panah dropdown di samping tombol Terbitkan , jika ini tidak terlihat).
Jika Anda belum masuk ke Akun Microsoft, Anda harus melakukannya di sini.
Pada halaman Terbitkan, Anda harus mengatur Langganan yang sama dengan yang Anda gunakan untuk pembuatan Web App Bot Service. Kemudian atur Tampilan sebagai Grup Sumber Daya dan, di struktur folder drop-down, pilih Grup Sumber Daya yang telah Anda buat sebelumnya. Klik OK.
Sekarang klik tombol Terbitkan , dan tunggu hingga Bot diterbitkan (mungkin perlu beberapa menit).
Bab 4 – Menyiapkan proyek Unity
Berikut ini adalah pengaturan khas untuk mengembangkan dengan realitas campuran, dan dengan demikian, adalah templat yang baik untuk proyek lain.
Buka Unity dan klik Baru.
Anda sekarang perlu memberikan nama proyek Unity. Sisipkan Bot HoloLens. Pastikan templat proyek diatur ke 3D. Atur Lokasi ke tempat yang sesuai untuk Anda (ingat, lebih dekat ke direktori akar lebih baik). Lalu, klik Buat proyek.
Dengan Unity terbuka, ada baiknya memeriksa Editor Skrip default diatur ke Visual Studio. Buka Edit > Preferensi lalu dari jendela baru, navigasikan ke Alat Eksternal. Ubah Editor Skrip Eksternal ke Visual Studio 2017. Tutup jendela Preferensi .
Selanjutnya, buka Pengaturan Build File > dan pilih Platform Windows Universal, lalu klik tombol Beralih Platform untuk menerapkan pilihan Anda.
Saat masih dalam Pengaturan Penyusunan File > dan pastikan bahwa:
Perangkat Target diatur ke HoloLens
Untuk headset imersif, atur Perangkat Target ke Perangkat Apa Pun.
Jenis Build diatur ke D3D
SDK diatur ke Terbaru diinstal
Versi Visual Studio diatur ke Terbaru diinstal
Build and Run diatur ke Komputer Lokal
Simpan adegan dan tambahkan ke build.
Lakukan ini dengan memilih Tambahkan Adegan Terbuka. Jendela penyimpanan akan muncul.
Buat folder baru untuk ini, dan adegan di masa mendatang, lalu pilih tombol Folder baru, untuk membuat folder baru, beri nama Adegan.
Buka folder Adegan yang baru dibuat, lalu di bidang Nama file: teks, ketik BotScene, lalu klik Simpan.
Pengaturan yang tersisa, di Pengaturan Build, harus dibiarkan sebagai default untuk saat ini.
Di jendela Pengaturan Build, klik tombol Pengaturan Pemutar, ini akan membuka panel terkait di ruang tempat Pemeriksa berada.
Di panel ini, beberapa pengaturan perlu diverifikasi:
Di tab Pengaturan Lainnya:
Versi Runtime Pembuatan Skrip harus Eksperimental (Setara NET 4.6); mengubah ini akan memerlukan mulai ulang Editor.
Scripting Backend harus .NET
Tingkat Kompatibilitas API harus .NET 4.6
Dalam tab Pengaturan Penerbitan, di bawah Kemampuan, periksa:
InternetClient
Mikrofon
Selanjutnya di bawah panel, di Pengaturan XR (ditemukan di bawah Pengaturan Penerbitan), centang Realitas Virtual yang Didukung, pastikan Windows Mixed Reality SDK ditambahkan.
Kembali ke Pengaturan Build Proyek Unity C# tidak lagi berwarna abu-abu; centang kotak di samping ini.
Tutup jendela Pengaturan Build.
Simpan adegan dan proyek Anda (FILE > SAVE SCENE / FILE > SAVE PROJECT).
Bab 5 – Penyiapan kamera
Penting
Jika Anda ingin melewati komponen Unity Siapkan kursus ini, dan lanjutkan langsung ke dalam kode, jangan ragu untuk mengunduh Paket Azure-MR-312-Package.unitypackage ini, impor ke proyek Anda sebagai Paket Kustom, lalu lanjutkan dari Bab 7.
Di panel Hierarki, pilih Kamera Utama.
Setelah dipilih, Anda akan dapat melihat semua komponen Kamera Utama di panel Inspektur.
- Objek Kamera harus diberi nama Kamera Utama (perhatikan ejaan)
- Tag Kamera Utama harus diatur ke MainCamera (perhatikan ejaan)
- Pastikan Posisi Transformasi diatur ke 0, 0, 0
- Atur Hapus Bendera ke Warna Solid.
- Atur Warna Latar Belakang komponen Kamera ke Hitam, Alpha 0 (Kode Hex: #00000000)
Bab 6 – Impor pustaka Newtonsoft
Untuk membantu Anda mendeserialisasi dan menserialisasi objek yang diterima dan dikirim ke Bot Service, Anda perlu mengunduh pustaka Newtonsoft . Anda akan menemukan versi yang kompatibel yang sudah diatur dengan struktur folder Unity yang benar di sini.
Untuk mengimpor pustaka Newtonsoft ke dalam proyek Anda, gunakan Paket Unity yang disertakan dengan kursus ini.
Tambahkan .unitypackage ke Unity dengan menggunakan opsi menu Paket Kustom Paket>Impor Aset.>
Dalam kotak Impor Paket Unity yang muncul, pastikan semuanya di bawah (dan termasuk) Plugin dipilih.
Klik tombol Impor untuk menambahkan item ke proyek Anda.
Buka folder Newtonsoft di bawah Plugin dalam tampilan proyek dan pilih plugin Newtonsoft.
Dengan plugin Newtonsoft dipilih, pastikan platform apa pun tidak dicentang, lalu pastikan bahwa WSAPlayer juga tidak dicentang, lalu klik Terapkan. Ini hanya untuk mengonfirmasi bahwa file dikonfigurasi dengan benar.
Catatan
Menandai plugin ini mengonfigurasinya untuk hanya digunakan di Editor Unity. Ada set yang berbeda di folder WSA yang akan digunakan setelah proyek diekspor dari Unity.
Selanjutnya, Anda perlu membuka folder WSA , di dalam folder Newtonsoft . Anda akan melihat salinan file yang sama yang baru saja Anda konfigurasikan. Pilih file, lalu di pemeriksa, pastikan bahwa
- Platform apa pun tidak dicentang
- hanya WSAPlayer yang diperiksa
- Proses dont diperiksa
Bab 7 - Buat BotTag
Buat objek Tag baru yang disebut BotTag. Pilih Kamera Utama di adegan. Klik menu drop-down Tag di panel Pemeriksa. Klik Tambahkan Tag.
Klik simbol + . Beri nama Tag baru sebagai BotTag, Simpan.
Peringatan
Jangan terapkan BotTag ke Kamera Utama. Jika Anda tidak sengaja melakukan ini, pastikan untuk mengubah tag Kamera Utama kembali ke MainCamera.
Bab 8 - Buat kelas BotObjects
Skrip pertama yang perlu Anda buat adalah kelas BotObjects , yang merupakan kelas kosong yang dibuat sehingga serangkaian objek kelas lain dapat disimpan dalam skrip yang sama dan diakses oleh skrip lain di adegan.
Pembuatan kelas ini murni pilihan arsitektur, objek-objek ini dapat dihosting dalam skrip Bot yang akan Anda buat nanti dalam kursus ini.
Untuk membuat kelas ini:
Klik kanan di panel Proyek, lalu Buat > Folder. Beri nama folder Skrip.
Klik dua kali pada folder Skrip untuk membukanya. Kemudian di dalam folder tersebut, klik kanan, dan pilih Buat > Skrip C#. Beri nama skrip BotObjects.
Klik dua kali pada skrip BotObjects baru untuk membukanya dengan Visual Studio.
Hapus konten skrip dan ganti dengan kode berikut:
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class BotObjects : MonoBehaviour{} /// <summary> /// Object received when first opening a conversation /// </summary> [Serializable] public class ConversationObject { public string ConversationId; public string token; public string expires_in; public string streamUrl; public string referenceGrammarId; } /// <summary> /// Object including all Activities /// </summary> [Serializable] public class ActivitiesRootObject { public List<Activity> activities { get; set; } public string watermark { get; set; } } [Serializable] public class Conversation { public string id { get; set; } } [Serializable] public class From { public string id { get; set; } public string name { get; set; } } [Serializable] public class Activity { public string type { get; set; } public string channelId { get; set; } public Conversation conversation { get; set; } public string id { get; set; } public From from { get; set; } public string text { get; set; } public string textFormat { get; set; } public DateTime timestamp { get; set; } public string serviceUrl { get; set; } }
Pastikan untuk menyimpan perubahan Anda di Visual Studio sebelum kembali ke Unity.
Bab 9 - Buat kelas GazeInput
Kelas berikutnya yang akan Anda buat adalah kelas GazeInput . Kelas ini bertanggung jawab untuk:
- Membuat kursor yang akan mewakili tatapan pemain.
- Mendeteksi objek yang terkena tatapan pemutar, dan memegang referensi ke objek yang terdeteksi.
Untuk membuat kelas ini:
Buka folder Skrip yang Anda buat sebelumnya.
Klik kanan di dalam folder, Buat > Skrip C#. Panggil skrip GazeInput.
Klik dua kali pada skrip GazeInput baru untuk membukanya dengan Visual Studio.
Sisipkan baris berikut tepat di atas nama kelas:
/// <summary> /// Class responsible for the User's gaze interactions /// </summary> [System.Serializable] public class GazeInput : MonoBehaviour
Kemudian tambahkan variabel berikut di dalam kelas GazeInput, di atas metode Start():
[Tooltip("Used to compare whether an object is to be interacted with.")] internal string InteractibleTag = "BotTag"; /// <summary> /// Length of the gaze /// </summary> internal float GazeMaxDistance = 300; /// <summary> /// Object currently gazed /// </summary> internal GameObject FocusedObject { get; private set; } internal GameObject _oldFocusedObject { get; private set; } internal RaycastHit HitInfo { get; private set; } /// <summary> /// Cursor object visible in the scene /// </summary> internal GameObject Cursor { get; private set; } internal bool Hit { get; private set; } internal Vector3 Position { get; private set; } internal Vector3 Normal { get; private set; } private Vector3 _gazeOrigin; private Vector3 _gazeDirection;
Kode untuk metode Start() harus ditambahkan. Ini akan dipanggil ketika kelas menginisialisasi:
/// <summary> /// Start method used upon initialization. /// </summary> internal virtual void Start() { FocusedObject = null; Cursor = CreateCursor(); }
Terapkan metode yang akan membuat instans dan mengatur kursor tatapan:
/// <summary> /// Method to create a cursor object. /// </summary> internal GameObject CreateCursor() { GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere); newCursor.SetActive(false); // Remove the collider, so it does not block Raycast. Destroy(newCursor.GetComponent<SphereCollider>()); newCursor.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f); Material mat = new Material(Shader.Find("Diffuse")); newCursor.GetComponent<MeshRenderer>().material = mat; mat.color = Color.HSVToRGB(0.0223f, 0.7922f, 1.000f); newCursor.SetActive(true); return newCursor; }
Terapkan metode yang akan mengatur Raycast dari Kamera Utama dan akan melacak objek yang berfokus saat ini.
/// <summary> /// Called every frame /// </summary> internal virtual void Update() { _gazeOrigin = Camera.main.transform.position; _gazeDirection = Camera.main.transform.forward; UpdateRaycast(); } /// <summary> /// Reset the old focused object, stop the gaze timer, and send data if it /// is greater than one. /// </summary> private void ResetFocusedObject() { // Ensure the old focused object is not null. if (_oldFocusedObject != null) { if (_oldFocusedObject.CompareTag(InteractibleTag)) { // Provide the OnGazeExited event. _oldFocusedObject.SendMessage("OnGazeExited", SendMessageOptions.DontRequireReceiver); } } } private void UpdateRaycast() { // Set the old focused gameobject. _oldFocusedObject = FocusedObject; RaycastHit hitInfo; // Initialize Raycasting. Hit = Physics.Raycast(_gazeOrigin, _gazeDirection, out hitInfo, GazeMaxDistance); HitInfo = hitInfo; // Check whether raycast has hit. if (Hit == true) { Position = hitInfo.point; Normal = hitInfo.normal; // Check whether the hit has a collider. if (hitInfo.collider != null) { // Set the focused object with what the user just looked at. FocusedObject = hitInfo.collider.gameObject; } else { // Object looked on is not valid, set focused gameobject to null. FocusedObject = null; } } else { // No object looked upon, set focused gameobject to null. FocusedObject = null; // Provide default position for cursor. Position = _gazeOrigin + (_gazeDirection * GazeMaxDistance); // Provide a default normal. Normal = _gazeDirection; } // Lerp the cursor to the given position, which helps to stabilize the gaze. Cursor.transform.position = Vector3.Lerp(Cursor.transform.position, Position, 0.6f); // Check whether the previous focused object is this same. If so, reset the focused object. if (FocusedObject != _oldFocusedObject) { ResetFocusedObject(); if (FocusedObject != null) { if (FocusedObject.CompareTag(InteractibleTag)) { // Provide the OnGazeEntered event. FocusedObject.SendMessage("OnGazeEntered", SendMessageOptions.DontRequireReceiver); } } } }
Pastikan untuk menyimpan perubahan Anda di Visual Studio sebelum kembali ke Unity.
Bab 10 – Buat kelas Bot
Skrip yang akan Anda buat sekarang disebut Bot. Ini adalah kelas inti aplikasi Anda, ia menyimpan:
- Kredensial Bot Aplikasi Web Anda
- Metode yang mengumpulkan perintah suara pengguna
- Metode yang diperlukan untuk memulai percakapan dengan Bot Aplikasi Web Anda
- Metode yang diperlukan untuk mengirim pesan ke Bot Aplikasi Web Anda
Untuk mengirim pesan ke Bot Service, koroutine SendMessageToBot() akan membangun aktivitas, yang merupakan objek yang dikenali oleh Bot Framework sebagai data yang dikirim oleh pengguna.
Untuk membuat kelas ini:
Klik dua kali pada folder Skrip , untuk membukanya.
Klik kanan di dalam folder Skrip , klik Buat > Skrip C#. Beri nama Bot skrip.
Klik dua kali pada skrip baru untuk membukanya dengan Visual Studio.
Perbarui namespace agar sama dengan yang berikut ini, di bagian atas kelas Bot :
using Newtonsoft.Json; using System.Collections; using System.Text; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Windows.Speech;
Di dalam kelas Bot tambahkan variabel berikut:
/// <summary> /// Static instance of this class /// </summary> public static Bot Instance; /// <summary> /// Material of the sphere representing the Bot in the scene /// </summary> internal Material botMaterial; /// <summary> /// Speech recognizer class reference, which will convert speech to text. /// </summary> private DictationRecognizer dictationRecognizer; /// <summary> /// Use this variable to identify the Bot Id /// Can be any value /// </summary> private string botId = "MRBotId"; /// <summary> /// Use this variable to identify the Bot Name /// Can be any value /// </summary> private string botName = "MRBotName"; /// <summary> /// The Bot Secret key found on the Web App Bot Service on the Azure Portal /// </summary> private string botSecret = "-- Add your Secret Key here --"; /// <summary> /// Bot Endpoint, v4 Framework uses v3 endpoint at this point in time /// </summary> private string botEndpoint = "https://directline.botframework.com/v3/directline"; /// <summary> /// The conversation object reference /// </summary> private ConversationObject conversation; /// <summary> /// Bot states to regulate the application flow /// </summary> internal enum BotState {ReadyToListen, Listening, Processing} /// <summary> /// Flag for the Bot state /// </summary> internal BotState botState; /// <summary> /// Flag for the conversation status /// </summary> internal bool conversationStarted = false;
Catatan
Pastikan Anda memasukkan Kunci Rahasia Bot ke dalam variabel botSecret . Anda akan mencatat Kunci Rahasia Bot Anda di awal kursus ini, di Bab 2, langkah 10.
Kode untuk Awake() dan Start() sekarang perlu ditambahkan.
/// <summary> /// Called on Initialization /// </summary> void Awake() { Instance = this; } /// <summary> /// Called immediately after Awake method /// </summary> void Start() { botState = BotState.ReadyToListen; }
Tambahkan dua handler yang dipanggil oleh pustaka ucapan saat pengambilan suara dimulai dan berakhir. DictationRecognizer akan secara otomatis berhenti menangkap suara pengguna saat pengguna berhenti berbicara.
/// <summary> /// Start microphone capture. /// </summary> public void StartCapturingAudio() { botState = BotState.Listening; botMaterial.color = Color.red; // Start dictation dictationRecognizer = new DictationRecognizer(); dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; dictationRecognizer.Start(); } /// <summary> /// Stop microphone capture. /// </summary> public void StopCapturingAudio() { botState = BotState.Processing; dictationRecognizer.Stop(); }
Handler berikut mengumpulkan hasil input suara pengguna dan memanggil koroutine yang bertanggung jawab untuk mengirim pesan ke Web App Bot Service.
/// <summary> /// This handler is called every time the Dictation detects a pause in the speech. /// </summary> private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence) { // Update UI with dictation captured Debug.Log($"User just said: {text}"); // Send dictation to Bot StartCoroutine(SendMessageToBot(text, botId, botName, "message")); StopCapturingAudio(); }
Koroutine berikut dipanggil untuk memulai percakapan dengan Bot. Anda akan melihat bahwa setelah panggilan percakapan selesai, panggilan akan memanggil SendMessageToCoroutine() dengan meneruskan serangkaian parameter yang akan mengatur aktivitas yang akan dikirim ke Bot Service sebagai pesan kosong. Ini dilakukan untuk meminta Bot Service memulai dialog.
/// <summary> /// Request a conversation with the Bot Service /// </summary> internal IEnumerator StartConversation() { string conversationEndpoint = string.Format("{0}/conversations", botEndpoint); WWWForm webForm = new WWWForm(); using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(conversationEndpoint, webForm)) { unityWebRequest.SetRequestHeader("Authorization", "Bearer " + botSecret); unityWebRequest.downloadHandler = new DownloadHandlerBuffer(); yield return unityWebRequest.SendWebRequest(); string jsonResponse = unityWebRequest.downloadHandler.text; conversation = new ConversationObject(); conversation = JsonConvert.DeserializeObject<ConversationObject>(jsonResponse); Debug.Log($"Start Conversation - Id: {conversation.ConversationId}"); conversationStarted = true; } // The following call is necessary to create and inject an activity of type //"conversationUpdate" to request a first "introduction" from the Bot Service. StartCoroutine(SendMessageToBot("", botId, botName, "conversationUpdate")); }
Koroutine berikut dipanggil untuk membangun aktivitas yang akan dikirim ke Bot Service.
/// <summary> /// Send the user message to the Bot Service in form of activity /// and call for a response /// </summary> private IEnumerator SendMessageToBot(string message, string fromId, string fromName, string activityType) { Debug.Log($"SendMessageCoroutine: {conversation.ConversationId}, message: {message} from Id: {fromId} from name: {fromName}"); // Create a new activity here Activity activity = new Activity(); activity.from = new From(); activity.conversation = new Conversation(); activity.from.id = fromId; activity.from.name = fromName; activity.text = message; activity.type = activityType; activity.channelId = "DirectLineChannelId"; activity.conversation.id = conversation.ConversationId; // Serialize the activity string json = JsonConvert.SerializeObject(activity); string sendActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId); // Send the activity to the Bot using (UnityWebRequest www = new UnityWebRequest(sendActivityEndpoint, "POST")) { www.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(json)); www.downloadHandler = new DownloadHandlerBuffer(); www.SetRequestHeader("Authorization", "Bearer " + botSecret); www.SetRequestHeader("Content-Type", "application/json"); yield return www.SendWebRequest(); // extrapolate the response Id used to keep track of the conversation string jsonResponse = www.downloadHandler.text; string cleanedJsonResponse = jsonResponse.Replace("\r\n", string.Empty); string responseConvId = cleanedJsonResponse.Substring(10, 30); // Request a response from the Bot Service StartCoroutine(GetResponseFromBot(activity)); } }
Koroutine berikut dipanggil untuk meminta respons setelah mengirim aktivitas ke Bot Service.
/// <summary> /// Request a response from the Bot by using a previously sent activity /// </summary> private IEnumerator GetResponseFromBot(Activity activity) { string getActivityEndpoint = string.Format("{0}/conversations/{1}/activities", botEndpoint, conversation.ConversationId); using (UnityWebRequest unityWebRequest1 = UnityWebRequest.Get(getActivityEndpoint)) { unityWebRequest1.downloadHandler = new DownloadHandlerBuffer(); unityWebRequest1.SetRequestHeader("Authorization", "Bearer " + botSecret); yield return unityWebRequest1.SendWebRequest(); string jsonResponse = unityWebRequest1.downloadHandler.text; ActivitiesRootObject root = new ActivitiesRootObject(); root = JsonConvert.DeserializeObject<ActivitiesRootObject>(jsonResponse); foreach (var act in root.activities) { Debug.Log($"Bot Response: {act.text}"); SetBotResponseText(act.text); } botState = BotState.ReadyToListen; botMaterial.color = Color.blue; } }
Metode terakhir yang akan ditambahkan ke kelas ini, diperlukan untuk menampilkan pesan dalam adegan:
/// <summary> /// Set the UI Response Text of the bot /// </summary> internal void SetBotResponseText(string responseString) { SceneOrganiser.Instance.botResponseText.text = responseString; }
Catatan
Anda mungkin melihat kesalahan dalam Konsol Editor Unity, tentang hilangnya kelas SceneOrganiser . Abaikan pesan ini, karena Anda akan membuat kelas ini nanti dalam tutorial.
Pastikan untuk menyimpan perubahan Anda di Visual Studio sebelum kembali ke Unity.
Bab 11 – Buat kelas Interaksi
Kelas yang akan Anda buat sekarang disebut Interaksi. Kelas ini digunakan untuk mendeteksi Input Ketuk HoloLens dari pengguna.
Jika pengguna mengetuk saat melihat objek Bot di adegan, dan Bot siap mendengarkan input suara, objek Bot akan berubah warna menjadi merah dan mulai mendengarkan input suara.
Kelas ini mewarisi dari kelas GazeInput , dan juga dapat mereferensikan metode Start() dan variabel dari kelas tersebut, ditandai dengan penggunaan basis.
Untuk membuat kelas ini:
Klik dua kali pada folder Skrip , untuk membukanya.
Klik kanan di dalam folder Skrip , klik Buat > Skrip C#. Beri nama skrip Interaksi.
Klik dua kali pada skrip baru untuk membukanya dengan Visual Studio.
Perbarui namespace layanan dan pewarisan kelas agar sama dengan yang berikut ini, di bagian atas kelas Interaksi :
using UnityEngine.XR.WSA.Input; public class Interactions : GazeInput {
Di dalam kelas Interaksi tambahkan variabel berikut:
/// <summary> /// Allows input recognition with the HoloLens /// </summary> private GestureRecognizer _gestureRecognizer;
Kemudian tambahkan metode Start() :
/// <summary> /// Called on initialization, after Awake /// </summary> internal override void Start() { base.Start(); //Register the application to recognize HoloLens user inputs _gestureRecognizer = new GestureRecognizer(); _gestureRecognizer.SetRecognizableGestures(GestureSettings.Tap); _gestureRecognizer.Tapped += GestureRecognizer_Tapped; _gestureRecognizer.StartCapturingGestures(); }
Tambahkan handler yang akan dipicu saat pengguna melakukan gerakan ketukan di depan kamera HoloLens
/// <summary> /// Detects the User Tap Input /// </summary> private void GestureRecognizer_Tapped(TappedEventArgs obj) { // Ensure the bot is being gazed upon. if(base.FocusedObject != null) { // If the user is tapping on Bot and the Bot is ready to listen if (base.FocusedObject.name == "Bot" && Bot.Instance.botState == Bot.BotState.ReadyToListen) { // If a conversation has not started yet, request one if(Bot.Instance.conversationStarted) { Bot.Instance.SetBotResponseText("Listening..."); Bot.Instance.StartCapturingAudio(); } else { Bot.Instance.SetBotResponseText("Requesting Conversation..."); StartCoroutine(Bot.Instance.StartConversation()); } } } }
Pastikan untuk menyimpan perubahan Anda di Visual Studio sebelum kembali ke Unity.
Bab 12 – Buat kelas SceneOrganiser
Kelas terakhir yang diperlukan di Lab ini disebut SceneOrganiser. Kelas ini akan mengatur adegan secara terprogram, dengan menambahkan komponen dan skrip ke Kamera Utama, dan membuat objek yang sesuai di adegan.
Untuk membuat kelas ini:
Klik dua kali pada folder Skrip , untuk membukanya.
Klik kanan di dalam folder Skrip , klik Buat > Skrip C#. Beri nama skrip SceneOrganiser.
Klik dua kali pada skrip baru untuk membukanya dengan Visual Studio.
Di dalam kelas SceneOrganiser tambahkan variabel berikut:
/// <summary> /// Static instance of this class /// </summary> public static SceneOrganiser Instance; /// <summary> /// The 3D text representing the Bot response /// </summary> internal TextMesh botResponseText;
Kemudian tambahkan metode Awake() dan Start():
/// <summary> /// Called on Initialization /// </summary> private void Awake() { Instance = this; } /// <summary> /// Called immediately after Awake method /// </summary> void Start () { // Add the GazeInput class to this object gameObject.AddComponent<GazeInput>(); // Add the Interactions class to this object gameObject.AddComponent<Interactions>(); // Create the Bot in the scene CreateBotInScene(); }
Tambahkan metode berikut, yang bertanggung jawab untuk membuat objek Bot di adegan dan menyiapkan parameter dan komponen:
/// <summary> /// Create the Sign In button object in the scene /// and sets its properties /// </summary> private void CreateBotInScene() { GameObject botObjInScene = GameObject.CreatePrimitive(PrimitiveType.Sphere); botObjInScene.name = "Bot"; // Add the Bot class to the Bot GameObject botObjInScene.AddComponent<Bot>(); // Create the Bot UI botResponseText = CreateBotResponseText(); // Set properties of Bot GameObject Bot.Instance.botMaterial = new Material(Shader.Find("Diffuse")); botObjInScene.GetComponent<Renderer>().material = Bot.Instance.botMaterial; Bot.Instance.botMaterial.color = Color.blue; botObjInScene.transform.position = new Vector3(0f, 2f, 10f); botObjInScene.tag = "BotTag"; }
Tambahkan metode berikut, yang bertanggung jawab untuk membuat objek UI di adegan, mewakili respons dari Bot:
/// <summary> /// Spawns cursor for the Main Camera /// </summary> private TextMesh CreateBotResponseText() { // Create a sphere as new cursor GameObject textObject = new GameObject(); textObject.transform.parent = Bot.Instance.transform; textObject.transform.localPosition = new Vector3(0,1,0); // Resize the new cursor textObject.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); // Creating the text of the Label TextMesh textMesh = textObject.AddComponent<TextMesh>(); textMesh.anchor = TextAnchor.MiddleCenter; textMesh.alignment = TextAlignment.Center; textMesh.fontSize = 50; textMesh.text = "Hi there, tap on me and I will start listening."; return textMesh; }
Pastikan untuk menyimpan perubahan Anda di Visual Studio sebelum kembali ke Unity.
Di Editor Unity, seret skrip SceneOrganiser dari folder Skrip ke Kamera Utama. Komponen Scene Organiser sekarang akan muncul pada objek Kamera Utama, seperti yang ditunjukkan pada gambar di bawah ini.
Bab 13 – Sebelum membangun
Untuk melakukan pengujian menyeluruh aplikasi Anda, Anda harus membongkarnya ke HoloLens Anda. Sebelum melakukannya, pastikan bahwa:
- Semua pengaturan yang disebutkan dalam Bab 4 diatur dengan benar.
- Skrip SceneOrganiser dilampirkan ke objek Kamera Utama.
- Di kelas Bot, pastikan Anda telah memasukkan Kunci Rahasia Bot Anda ke dalam variabel botSecret.
Bab 14 - Membangun dan Memihak ke HoloLens
Semua yang diperlukan untuk bagian Unity dari proyek ini sekarang telah selesai, jadi sekarang saatnya untuk membangunnya dari Unity.
Navigasi ke Pengaturan Build, Pengaturan Build File>....
Dari jendela Pengaturan Build, klik Bangun.
Jika belum, centang Proyek Unity C#.
Klik Bangun. Unity akan meluncurkan jendela File Explorer , tempat Anda perlu membuat lalu memilih folder untuk membangun aplikasi. Buat folder tersebut sekarang, dan beri nama Aplikasi. Kemudian dengan folder Aplikasi dipilih, klik Pilih Folder.
Unity akan mulai membangun proyek Anda ke folder Aplikasi .
Setelah Unity selesai membangun (mungkin perlu waktu), Unity akan membuka jendela File Explorer di lokasi build Anda (periksa bilah tugas Anda, karena mungkin tidak selalu muncul di atas jendela Anda, tetapi akan memberi tahu Anda tentang penambahan jendela baru).
Bab 15 - Menyebarkan ke HoloLens
Untuk menyebarkan di HoloLens:
Anda akan memerlukan Alamat IP HoloLens Anda (untuk Penyebaran Jarak Jauh), dan untuk memastikan HoloLens Anda berada dalam Mode Pengembang. Untuk melakukan ini:
- Sementara mengenakan HoloLens Anda, buka Pengaturan.
- Buka Opsi Tingkat Lanjut Wi-Fi Jaringan & > Internet >
- Perhatikan alamat IPv4.
- Selanjutnya, navigasikan kembali ke Pengaturan, lalu ke Pembaruan & Keamanan > Untuk Pengembang
- Atur Mode Pengembang Aktif.
Navigasi ke build Unity baru Anda ( folder Aplikasi ) dan buka file solusi dengan Visual Studio.
Di Konfigurasi Solusi pilih Debug.
Di Platform Solusi, pilih x86, Komputer Jarak Jauh.
Buka menu Build dan klik Sebarkan Solusi, untuk memuat samping aplikasi ke HoloLens Anda.
Aplikasi Anda sekarang akan muncul dalam daftar aplikasi yang diinstal di HoloLens Anda, siap untuk diluncurkan!
Catatan
Untuk menyebarkan ke headset imersif, atur Platform Solusi ke Komputer Lokal, dan atur Konfigurasi ke Debug, dengan x86 sebagai Platform. Kemudian sebarkan ke komputer lokal, menggunakan menu Build, memilih Sebarkan Solusi.
Bab 16 – Menggunakan aplikasi di HoloLens
Setelah meluncurkan aplikasi, Anda akan melihat Bot sebagai bola biru di depan Anda.
Gunakan Tap Gesture saat Anda menatap bola untuk memulai percakapan.
Tunggu hingga percakapan dimulai (UI akan menampilkan pesan saat terjadi). Setelah Anda menerima pesan pengantar dari Bot, ketuk lagi pada Bot sehingga akan berubah menjadi merah dan mulai mendengarkan suara Anda.
Setelah berhenti berbicara, aplikasi Anda akan mengirim pesan Anda ke Bot dan Anda akan segera menerima respons yang akan ditampilkan di UI.
Ulangi proses untuk mengirim lebih banyak pesan ke Bot Anda (Anda harus mengetuk setiap kali Anda ingin membuat pesan).
Percakapan ini menunjukkan bagaimana Bot dapat menyimpan informasi (nama Anda), sementara juga memberikan informasi yang diketahui (seperti item yang diisi).
Beberapa pertanyaan untuk diajukan kepada Bot:
what do you sell?
how much are umbrellas?
how much are raincoats?
Aplikasi Web App Bot (v4) Anda yang sudah selesai
Selamat, Anda membuat aplikasi realitas campuran yang memanfaatkan Azure Web App Bot, Microsoft Bot Framework v4.
Latihan bonus
Latihan 1
Struktur percakapan di Lab ini sangat mendasar. Gunakan Microsoft LUIS untuk memberikan kemampuan pemahaman bahasa alami bot Anda.
Latihan 2
Contoh ini tidak termasuk mengakhiri percakapan dan memulai ulang percakapan baru. Untuk membuat fitur Bot selesai, coba terapkan penutupan ke percakapan.