101E. Основы смешанной реальности: полный проект с использованием эмулятораMR Basics 101E: Complete project with emulator

Примечание

Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах.They will be maintained to continue working on the supported devices. Опубликован новый цикл руководств для HoloLens 2.A new series of tutorials has been posted for HoloLens 2.


В этом руководстве описывается полный проект, встроенный в Unity, демонстрирующий основные функции Windows Mixed Reality в HoloLens, включая взгляд, жесты, речевой ввод, Пространственный звук и пространственное сопоставление.This tutorial will walk you through a complete project, built in Unity, that demonstrates core Windows Mixed Reality features on HoloLens including gaze, gestures, voice input, spatial sound and spatial mapping. Выполнение руководства займет примерно 1 час.The tutorial will take approximately 1 hour to complete.

Поддержка устройствDevice support

КурсCourse HoloLensHoloLens Иммерсивные гарнитурыImmersive headsets
101E. Основы смешанной реальности: полный проект с использованием эмулятораMR Basics 101E: Complete project with emulator ✔️✔️

Перед началом работыBefore you start

Предварительные требованияPrerequisites

Файлы проектаProject files

  • Скачайте файлы , необходимые для проекта.Download the files required by the project. Требуется Unity 2017,2 или более поздней версии.Requires Unity 2017.2 or later.
    • Если вам по-прежнему требуется поддержка Unity 5,6, используйте Этот выпуск.If you still need Unity 5.6 support, please use this release.
    • Если вам по-прежнему требуется поддержка Unity 5,5, используйте Этот выпуск.If you still need Unity 5.5 support, please use this release.
    • Если вам по-прежнему требуется поддержка Unity 5,4, используйте Этот выпуск.If you still need Unity 5.4 support, please use this release.
  • Отмена архивации файлов на Рабочий стол или другого места для удобства доступа.Un-archive the files to your desktop or other easy to reach location. В качестве имени папки используйте Origami.Keep the folder name as Origami.

Примечание

Если вы хотите просмотреть исходный код перед загрузкой, он доступен на сайте GitHub.If you want to look through the source code before downloading, it's available on GitHub.

Глава 1-"Холо"Chapter 1 - "Holo" world

В этой главе мы создадим наш первый проект Unity и пошаговым процессом сборки и развертывания.In this chapter, we'll setup our first Unity project and step through the build and deploy process.

ЦелиObjectives

  • Настройка Unity для разработки с Holographic.Set up Unity for holographic development.
  • Создайте голограмму.Make a hologram.
  • Ознакомьтесь с созданной голограммой.See a hologram that you made.

ИнструкцииInstructions

  • Запустите Unity.Start Unity.
  • Щелкните Open(Открыть).Select Open.
  • Введите Location в качестве папки Origami , которая была отменена для архивации.Enter location as the Origami folder you previously un-archived.
  • Выберите Origami и щелкните выбрать папку.Select Origami and click Select Folder.
  • Сохраните новую сцену: файл / сохранить сцену как.Save the new scene: File / Save Scene As.
  • Присвойте сцене имя Origami и нажмите кнопку Save (сохранить ).Name the scene Origami and press the Save button.

Настройка основной камерыSetup the main camera

  • На панели Иерархия выберите объект Main Camera.In the Hierarchy Panel, select Main Camera.
  • В инспекторе задайте для его параметра «transform » значение 0, 0, 0.In the Inspector set its transform position to 0,0,0.
  • Найдите свойство clear flags и измените раскрывающийся список с скибокс на сплошной цвет.Find the Clear Flags property, and change the dropdown from Skybox to Solid color.
  • Щелкните поле Фон, чтобы открыть палитру.Click on the Background field to open a color picker.
  • Задайте для R, G, B, and A (Красный, зеленый, синий и альфа-компонент) значение 0.Set R, G, B, and A to 0.

Настройка сценыSetup the scene

  • На панели Иерархия щелкните создать и создать пустой.In the Hierarchy Panel, click on Create and Create Empty.
  • Щелкните правой кнопкой мыши новый GameObject и выберите команду Переименовать.Right-click the new GameObject and select Rename. Переименуйте GameObject в оригамиколлектион.Rename the GameObject to OrigamiCollection.
  • Из папки голограмм на панели проекта:From the Holograms folder in the Project Panel:
    • Перетащите этап в иерархию, чтобы он был дочерним элементом оригамиколлектион.Drag Stage into the Hierarchy to be a child of OrigamiCollection.
    • Перетащите Sphere1 в иерархию, чтобы она была дочерней для оригамиколлектион.Drag Sphere1 into the Hierarchy to be a child of OrigamiCollection.
    • Перетащите Sphere2 в иерархию, чтобы она была дочерней для оригамиколлектион.Drag Sphere2 into the Hierarchy to be a child of OrigamiCollection.
  • Щелкните правой кнопкой мыши направленный объект Light на панели Иерархия и выберите команду Удалить.Right-click the Directional Light object in the Hierarchy Panel and select Delete.
  • Перетащите индикаторы из папки голограммы в корневую папку панели Иерархия.From the Holograms folder, drag Lights into the root of the Hierarchy Panel.
  • В иерархии выберите оригамиколлектион.In the Hierarchy, select the OrigamiCollection.
  • В инспекторе задайте для параметра Расположение преобразования значение 0,-0,5, 2,0.In the Inspector, set the transform position to 0, -0.5, 2.0.
  • Нажмите кнопку воспроизвести в Unity, чтобы просмотреть голограммы.Press the Play button in Unity to preview your holograms.
  • В окне предварительного просмотра должны отобразиться объекты Origami.You should see the Origami objects in the preview window.
  • Чтобы выйти из режима предварительного просмотра, нажмите кнопку воспроизвести еще раз.Press Play a second time to stop preview mode.

Экспорт проекта из Unity в Visual StudioExport the project from Unity to Visual Studio

  • В Unity выберите файл > параметры сборки.In Unity select File > Build Settings.
  • Выберите Магазин Windows в списке платформа и щелкните Переключить платформу.Select Windows Store in the Platform list and click Switch Platform.
  • Задайте для пакета SDK значение универсальное 10 , а для типа сборкиD3D.Set SDK to Universal 10 and Build Type to D3D.
  • Проверьте проекты C# для Unity.Check Unity C# Projects.
  • Щелкните Добавить открытые сцены , чтобы добавить сцену.Click Add Open Scenes to add the scene.
  • Щелкните Параметры проигрывателя....Click Player Settings....
  • На панели инспектора выберите логотип магазина Windows.In the Inspector Panel select the Windows Store logo. Затем выберите Параметры публикации.Then select Publishing Settings.
  • В разделе возможности выберите возможности микрофона и спатиалперцептион .In the Capabilities section, select the Microphone and SpatialPerception capabilities.
  • Вернувшись в окно параметры сборки, щелкните Сборка.Back in the Build Settings window, click Build.
  • Создайте новую папку с именем App.Create a New Folder named "App".
  • Щелкните папку приложения одним щелчком мыши.Single click the App Folder.
  • Нажмите кнопку выбрать папку.Press Select Folder.
  • После завершения Unity появится окно проводника.When Unity is done, a File Explorer window will appear.
  • Откройте папку приложения .Open the App folder.
  • Откройте решение Origami Visual Studio.Open the Origami Visual Studio Solution.
  • С помощью верхней панели инструментов в Visual Studio измените целевой объект с отладка на выпуск и с ARM на x86.Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to X86.
    • Щелкните стрелку рядом с кнопкой устройство и выберите эмулятор HoloLens.Click on the arrow next to the Device button, and select HoloLens Emulator.
    • Щелкните Отладка-> начать без отладки или нажмите клавиши CTRL + F5.Click Debug -> Start Without debugging or press Ctrl + F5.
    • Через некоторое время эмулятор начнет работу с проектом Origami.After some time the emulator will start with the Origami project. При первом запуске эмуляторадля запуска эмулятора может потребоваться до 15 минут.When first launching the emulator, it can take as long as 15 minutes for the emulator to start up. После запуска не закрывайте его.Once it starts, do not close it.

Глава 2. взглядChapter 2 - Gaze

В этой главе мы будем познакомиться с первым из трех способов взаимодействия с голограммами — Взгляните.In this chapter, we are going to introduce the first of three ways of interacting with your holograms -- gaze.

ЦелиObjectives

  • Визуализируйте взгляд с помощью курсора, заблокированного по всему миру.Visualize your gaze using a world-locked cursor.

ИнструкцииInstructions

  • Вернитесь к проекту Unity и закройте окно параметры сборки, если оно все еще открыто.Go back to your Unity project, and close the Build Settings window if it's still open.
  • Выберите папку голограммы на панели проект.Select the Holograms folder in the Project panel.
  • Перетащите объект курсора на панель Иерархия на корневом уровне.Drag the Cursor object into the Hierarchy panel at the root level.
  • Дважды щелкните объект курсора , чтобы просмотреть его Подробнее.Double-click on the Cursor object to take a closer look at it.
  • Щелкните правой кнопкой мыши папку сценарии на панели проект.Right-click on the Scripts folder in the Project panel.
  • Щелкните подменю создать .Click the Create sub-menu.
  • Выберите скрипт C#.Select C# Script.
  • Назовите сценарий ворлдкурсор.Name the script WorldCursor. Примечание. в имени учитывается регистр.Note: The name is case-sensitive. Добавлять расширение CS не требуется.You do not need to add the .cs extension.
  • Выберите объект курсора на панели Иерархия.Select the Cursor object in the Hierarchy panel.
  • Перетащите сценарий ворлдкурсор на Панель инспектора.Drag and drop the WorldCursor script into the Inspector panel.
  • Дважды щелкните скрипт ворлдкурсор , чтобы открыть его в Visual Studio.Double-click the WorldCursor script to open it in Visual Studio.
  • Скопируйте и вставьте этот код в WorldCursor.CS и Сохраните все.Copy and paste this code into WorldCursor.cs and Save All.
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;
        }
    }
}
  • Перестройте приложение из файла > параметры сборки.Rebuild the app from File > Build Settings.
  • Вернитесь к решению Visual Studio, которое ранее использовалось для развертывания в эмуляторе.Return to the Visual Studio solution previously used to deploy to the emulator.
  • При появлении запроса выберите "перезагрузить все".Select 'Reload All' when prompted.
  • Щелкните Отладка-> начать без отладки или нажмите клавиши CTRL + F5.Click Debug -> Start Without debugging or press Ctrl + F5.
  • Используйте контроллер Xbox для просмотра сцены.Use the Xbox controller to look around the scene. Обратите внимание, что курсор взаимодействует с формой объектов.Notice how the cursor interacts with the shape of objects.

Глава 3 — жестыChapter 3 - Gestures

В этой главе мы добавим поддержку жестов.In this chapter, we'll add support for gestures. Когда пользователь выбирает бумажную сферу, мы сделаем сферу, включив для нее функцию "сила притяжения" с помощью системы обработки физических модулей Unity.When the user selects a paper sphere, we'll make the sphere fall by turning on gravity using Unity's physics engine.

ЦелиObjectives

  • Контролируйте голограммы с помощью жеста выбора.Control your holograms with the Select gesture.

ИнструкцииInstructions

Начнем с создания сценария, чем может обнаружить жест выбора.We'll start by creating a script than can detect the Select gesture.

  • В папке Scripts создайте скрипт с именем газежестуреманажер.In the Scripts folder, create a script named GazeGestureManager.
  • Перетащите скрипт газежестуреманажер на объект оригамиколлектион в иерархии.Drag the GazeGestureManager script onto the OrigamiCollection object in the Hierarchy.
  • Откройте скрипт газежестуреманажер в Visual Studio и добавьте следующий код:Open the GazeGestureManager script in Visual Studio and add the following code:
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();
        }
    }
}
  • Создайте другой скрипт в папке Scripts с именем сферекоммандс.Create another script in the Scripts folder, this time named SphereCommands.
  • Разверните объект оригамиколлектион в представлении иерархии.Expand the OrigamiCollection object in the Hierarchy view.
  • Перетащите скрипт сферекоммандс на объект Sphere1 на панели Иерархия.Drag the SphereCommands script onto the Sphere1 object in the Hierarchy panel.
  • Перетащите скрипт сферекоммандс на объект Sphere2 на панели Иерархия.Drag the SphereCommands script onto the Sphere2 object in the Hierarchy panel.
  • Откройте скрипт в Visual Studio для редактирования и замените код по умолчанию следующим:Open the script in Visual Studio for editing, and replace the default code with this:
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;
        }
    }
}
  • Экспортируйте, создайте и разверните приложение в эмуляторе HoloLens.Export, build and deploy the app to the HoloLens emulator.
  • Взгляните на сцену и помещайтесь по центру на одном из шарик.Look around the scene, and center on one of the spheres.
  • Нажмите кнопку на контроллере Xbox или нажмите клавишу пробел, чтобы имитировать жест выбора.Press the A button on the Xbox controller or press the Spacebar to simulate the Select gesture.

Глава 4-VoiceChapter 4 - Voice

В этой главе мы добавим поддержку двух голосовых команд: "сбросить мир", чтобы вернуть удаленные шарик к их исходному расположению и "удалить шар", чтобы сделать сферу.In this chapter, we'll add support for two voice commands: "Reset world" to returns the dropped spheres to their original location, and "Drop sphere" to make the sphere fall.

ЦелиObjectives

  • Добавление речевых команд, которые всегда прослушиваются в фоновом режиме.Add voice commands that always listen in the background.
  • Создайте голограмму, которая реагирует на голосовую команду.Create a hologram that reacts to a voice command.

ИнструкцииInstructions

  • В папке Scripts создайте скрипт с именем спичманажер.In the Scripts folder, create a script named SpeechManager.
  • Перетащите скрипт спичманажер на объект оригамиколлектион в иерархииDrag the SpeechManager script onto the OrigamiCollection object in the Hierarchy
  • Откройте скрипт спичманажер в Visual Studio.Open the SpeechManager script in Visual Studio.
  • Скопируйте и вставьте этот код в SpeechManager.CS и Сохраните все:Copy and paste this code into SpeechManager.cs and Save All:
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();
        }
    }
}
  • Откройте скрипт сферекоммандс в Visual Studio.Open the SphereCommands script in Visual Studio.
  • Обновите скрипт для чтения следующим образом:Update the script to read as follows:
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();
    }
}
  • Экспортируйте, создайте и разверните приложение в эмуляторе HoloLens.Export, build and deploy the app to the HoloLens emulator.
  • Эмулятор будет поддерживать микрофон компьютера и отвечать на ваш голос: настройте представление таким образом, чтобы курсор наследовался на одном из шарик и сказал «Drop Sphere».The emulator will support your PC's microphone and respond to your voice: adjust the view so the cursor is on one of the spheres, and say "Drop Sphere".
  • Скажите «сбросить мир», чтобы вернуть их в исходное положение.Say "Reset World" to bring them back to their initial positions.

Глава 5 — Пространственный звукChapter 5 - Spatial sound

В этой главе мы добавим музыку в приложение, а затем активируем звуковые эффекты для определенных действий.In this chapter, we'll add music to the app, and then trigger sound effects on certain actions. Мы будем использовать Пространственный звук , чтобы дать звуковое сопровождение определенному месту в трехмерном пространстве.We'll be using spatial sound to give sounds a specific location in 3D space.

ЦелиObjectives

  • Прослушайте голограммы в своем мире.Hear holograms in your world.

ИнструкцииInstructions

  • В элементе Unity выберите в верхнем меню правка > параметры проекта > звукIn the Unity select from the top menu Edit > Project Settings > Audio
  • Найдите параметр подключаемого модуля спатиализер и выберите MS хртф спатиализер.Find the Spatializer Plugin setting and select MS HRTF Spatializer.
  • В папке голограмм перетащите объект окружения на объект оригамиколлектион на панели Иерархия.From the Holograms folder, drag the Ambience object onto the OrigamiCollection object in the Hierarchy Panel.
  • Выберите оригамиколлектион и найдите компонент " источник аудио ".Select OrigamiCollection and find the Audio Source component. Измените следующие свойства:Change these properties:
    • Проверьте свойство спатиализе .Check the Spatialize property.
    • Проверьте Воспроизведение в спящем режиме.Check the Play On Awake.
    • Измените пространственный переход на 3D , перетащив ползунок вправо.Change Spatial Blend to 3D by dragging the slider all the way to the right.
    • Проверьте свойство Loop .Check the Loop property.
    • Разверните Параметры 3D Sound и введите 0,1 для уровня Doppler.Expand 3D Sound Settings, and enter 0.1 for Doppler Level.
    • Задайте для параметра Volume роллофф значение логарифмической роллофф.Set Volume Rolloff to Logarithmic Rolloff.
    • Установите Максимальное расстояние равным 20.Set Max Distance to 20.
  • В папке Scripts создайте скрипт с именем сфересаундс.In the Scripts folder, create a script named SphereSounds.
  • Перетащите сфересаундс в объекты Sphere1 и Sphere2 в иерархии.Drag SphereSounds to the Sphere1 and Sphere2 objects in the Hierarchy.
  • Откройте сфересаундс в Visual Studio, обновите следующий код и Сохраните все.Open SphereSounds in Visual Studio, update the following code and Save All.
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();
        }
    }
}
  • Сохраните скрипт и вернитесь в Unity.Save the script, and return to Unity.
  • Экспортируйте, создайте и разверните приложение в эмуляторе HoloLens.Export, build and deploy the app to the HoloLens emulator.
  • Выизнос наушников, чтобы получить полный результат, и продвинуться ближе и дальше от этапа, чтобы услышать смену звуков.Wear headphones to get the full effect, and move closer and further from the Stage to hear the sounds change.

Глава 6-пространственное сопоставлениеChapter 6 - Spatial mapping

Теперь мы будем использовать пространственное сопоставление , чтобы поместить игровую доску на реальный объект в реальном мире.Now we are going to use spatial mapping to place the game board on a real object in the real world.

ЦелиObjectives

  • Приведите реальный мир к виртуальному миру.Bring your real world into the virtual world.
  • Размещайте голограммы, где это важно.Place your holograms where they matter most to you.

ИнструкцииInstructions

  • Щелкните папку голограмм на панели проект.Click on the Holograms folder in the Project panel.
  • Перетащите ресурс пространственного сопоставления в корень иерархии.Drag the Spatial Mapping asset into the root of the Hierarchy.
  • Щелкните объект пространственного сопоставления в иерархии.Click on the Spatial Mapping object in the Hierarchy.
  • На панели инспектора измените следующие свойства.In the Inspector panel, change the following properties:
    • Установите флажок рисовать визуальные сетки .Check the Draw Visual Meshes box.
    • Перейдите на вкладку Рисование материалов и щелкните окружность справа.Locate Draw Material and click the circle on the right. Введите "каркасная схема" в поле поиска вверху.Type "wireframe" into the search field at the top. Щелкните результат, а затем закройте окно.Click on the result and then close the window.
  • Экспортируйте, создайте и разверните приложение в эмуляторе HoloLens.Export, build and deploy the app to the HoloLens emulator.
  • При запуске приложения сеть ранее проверенной в реальном времени области будет отображаться в каркасе.When the app runs, a mesh of a previously scanned real-world living room will be rendered in wireframe.
  • Следите за тем, как изкрутка будет выпадать за пределы этапа, и на этаж!Watch how a rolling sphere will fall off the stage, and onto the floor!

Теперь мы покажем, как переместить Оригамиколлектион в новое расположение:Now we'll show you how to move the OrigamiCollection to a new location:

  • В папке Scripts создайте скрипт с именем таптоплацепарент.In the Scripts folder, create a script named TapToPlaceParent.
  • В иерархии разверните оригамиколлектион и выберите объект Stage .In the Hierarchy, expand the OrigamiCollection and select the Stage object.
  • Перетащите скрипт таптоплацепарент на объект Stage.Drag the TapToPlaceParent script onto the Stage object.
  • Откройте скрипт таптоплацепарент в Visual Studio и обновите его следующим образом:Open the TapToPlaceParent script in Visual Studio, and update it to be the following:
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;
            }
        }
    }
}
  • Экспорт, сборка и развертывание приложения.Export, build and deploy the app.
  • Теперь вы можете разместить игру в определенном месте, облаками ее с помощью жеста выбора (a или пробела), а затем переместить в новое место и снова с помощью жеста выбора.Now you should now be able to place the game in a specific location by gazing at it, using the Select gesture (A or Spacebar) and then moving to a new location, and using the Select gesture again.

КонецThe end

И это окончание этого руководства.And that's the end of this tutorial!

Вы узнали:You learned:

  • Создание приложения holographic в Unity.How to create a holographic app in Unity.
  • Использование взгляда, жеста, голоса, звуков и пространственного сопоставления.How to make use of gaze, gesture, voice, sounds, and spatial mapping.
  • Как создать и развернуть приложение с помощью Visual Studio.How to build and deploy an app using Visual Studio.

Теперь вы готовы приступить к созданию собственных приложений holographic!You are now ready to start creating your own holographic apps!

См. такжеSee also