MR 기본 101: 디바이스를 사용하여 프로젝트 수행MR Basics 101: Complete project with device


참고

Mixed Reality 아카데미 자습서는 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.


이 자습서에서는 응시, 제스처, 음성 입력, 공간 음향공간 매핑을비롯 한 HoloLens의 핵심 Windows Mixed Reality 기능을 보여 주는 Unity에서 빌드된 전체 프로젝트를 안내 합니다.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
MR 기본 101: 디바이스를 사용하여 프로젝트 수행MR Basics 101: Complete project with device ✔️✔️

시작하기 전에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. 폴더 이름을 종이 접기 로 유지 합니다.Keep the folder name as Origami.

참고

다운로드 하기 전에 소스 코드를 확인 하려는 경우 GitHub에서 사용할 수있습니다.If you want to look through the source code before downloading, it's available on GitHub.

1 장-"Holo" 세계Chapter 1 - "Holo" world

이 장에서는 첫 번째 Unity 프로젝트를 설정 하 고 빌드 및 배포 프로세스를 단계별로 진행 합니다.In this chapter, we'll setup our first Unity project and step through the build and deploy process.

목표Objectives

  • Holographic 개발용 Unity를 설정 합니다.Set up Unity for holographic development.
  • 홀로그램을 만듭니다.Make a hologram.
  • 만든 홀로그램을 확인 하세요.See a hologram that you made.

지침Instructions

  • Unity를 시작합니다.Start Unity.
  • 열기 를 선택합니다.Select Open.
  • 이전에 보관 하지 않은 종이 접기 폴더로 위치를 입력 합니다.Enter location as the Origami folder you previously un-archived.
  • 종이 를 선택 하 고 폴더 선택 을 클릭 합니다.Select Origami and click Select Folder.
  • 종이 에는 장면이 포함 되지 않으므로 빈 기본 장면을 새 파일에 저장 합니다. 파일 에 / 장면 저장 을 사용 합니다.Since the Origami project does not contain a scene, save the empty default scene to a new file using: File / Save Scene As.
  • 새 장면 종이 의 이름을로 하 고 저장 단추를 누릅니다.Name the new scene Origami and press the Save button.

기본 가상 카메라 설정Setup the main virtual camera

  • 계층 구조 패널 에서 주 카메라 를 선택합니다.In the Hierarchy Panel, select Main Camera.
  • Inspector 의 변환 위치를 0, 0, 0 으로 설정 합니다.In the Inspector set its transform position to 0,0,0.
  • Clear Flags 속성을 찾고 Dropdown을 Skybox 에서 Solid color 로 변경 합니다.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 및 A0 으로 설정합니다.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의 이름을 OrigamiCollection 로 바꿉니다.Rename the GameObject to OrigamiCollection.
  • 프로젝트 패널의 Holograms 폴더에서 자산을 확장 하 고 Holograms를 선택 하거나 프로젝트 패널에서 Holograms 폴더를 두 번 클릭 합니다.From the Holograms folder in the Project Panel (expand Assets and select Holograms or double click the Holograms folder in the Project Panel):
    • 스테이지 를 계층 구조로 끌어 OrigamiCollection 의 자식으로 만듭니다.Drag Stage into the Hierarchy to be a child of OrigamiCollection.
    • Sphere1 를 계층 구조로 끌어 OrigamiCollection 의 자식으로 만듭니다.Drag Sphere1 into the Hierarchy to be a child of OrigamiCollection.
    • Sphere2 를 계층 구조로 끌어 OrigamiCollection 의 자식으로 만듭니다.Drag Sphere2 into the Hierarchy to be a child of OrigamiCollection.
  • 계층 패널 에서 방향 광원 개체를 마우스 오른쪽 단추로 클릭 하 고 삭제 를 선택 합니다.Right-click the Directional Light object in the Hierarchy Panel and select Delete.
  • Holograms 폴더에서 조명을 계층 패널 의 루트로 끕니다.From the Holograms folder, drag Lights into the root of the Hierarchy Panel.
  • 계층 에서 OrigamiCollection 를 선택 합니다.In the Hierarchy, select the OrigamiCollection.
  • 검사기 에서 변환 위치를 0,-0.5, 2.0 로 설정 합니다.In the Inspector, set the transform position to 0, -0.5, 2.0.
  • Holograms를 미리 보려면 Unity의 재생 단추를 누릅니다.Press the Play button in Unity to preview your holograms.
  • 미리 보기 창에 종이 개체를 표시 해야 합니다.You should see the Origami objects in the preview window.
  • 재생 을 두 번 눌러 미리 보기 모드를 중지 합니다.Press Play a second time to stop preview mode.

Unity에서 Visual Studio로 프로젝트 내보내기Export the project from Unity to Visual Studio

  • Unity에서 파일 > 빌드 설정 을 선택 합니다.In Unity select File > Build Settings.

  • 플랫폼 목록에서 유니버설 Windows 플랫폼 을 선택 하 고 플랫폼 전환 을 클릭 합니다.Select Universal Windows Platform in the Platform list and click Switch Platform.

  • SDKUniversal 10 으로 설정 하 고 빌드 형식을 D3D 로 설정 합니다.Set SDK to Universal 10 and Build Type to D3D.

  • Unity c # 프로젝트 를 확인 합니다.Check Unity C# Projects.

  • 열려 있는 장면 추가 를 클릭 하 여 장면을 추가 합니다.Click Add Open Scenes to add the scene.

  • 빌드 를 클릭한 다음Click Build.

  • 표시 되는 파일 탐색기 창에서 "App" 이라는 새 폴더 를 만듭니다.In the file explorer window that appears, 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.

  • (두 번 클릭) 종이 를 엽니다.Open (double click) Origami.sln.

  • Visual Studio의 맨 위 도구 모음을 사용 하 여 대상을 디버그에서 릴리스 로, ARM에서 x 86 으로 변경 합니다.Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to X86.

  • 장치 단추 옆의 화살표를 클릭 하 고 원격 컴퓨터 를 선택 하 여 wi-fi를 통해 배포 합니다.Click on the arrow next to the Device button, and select Remote Machine to deploy over Wi-Fi.

    • 주소 를 HoloLens의 이름 또는 IP 주소로 설정 합니다.Set the Address to the name or IP address of your HoloLens. 장치 IP 주소를 알 수 없는 경우 설정 > 네트워크 & 인터넷 > 고급 옵션 을 확인 하거나 Cortana "안녕하세요. 내 IP 주소는 무엇입니까?" 를 확인 합니다.If you do not know your device IP address, look in Settings > Network & Internet > Advanced Options or ask Cortana "Hey Cortana, What's my IP address?"
    • HoloLens가 USB를 통해 연결 된 경우 장치 를 선택 하 여 usb를 통해 배포할 수 있습니다.If the HoloLens is attached over USB, you may instead select Device to deploy over USB.
    • 인증 모드유니버설 으로 설정 된 상태로 둡니다.Leave the Authentication Mode set to Universal.
    • 선택 을 클릭 합니다.Click Select
  • 디버그 > 디버깅 하지 않고 시작 을 클릭 하거나 ctrl + F5 를 누릅니다.Click Debug > Start Without debugging or press Ctrl + F5. 처음으로 장치에 배포 하는 경우에는 Visual Studio와 쌍으로 연결 해야 합니다.If this is the first time deploying to your device, you will need to pair it with Visual Studio.

  • 이제 종이 접기 프로젝트가 빌드하여 HoloLens에 배포 되 고 실행 됩니다.The Origami project will now build, deploy to your HoloLens, and then run.

  • HoloLens에 배치 하 고 새 holograms를 확인 하세요.Put on your HoloLens and look around to see your new holograms.

2 장-응시Chapter 2 - Gaze

이 장에서는 holograms와 상호 작용 하는 세 가지 방법, 즉 응시를 소개 하겠습니다.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.
  • 프로젝트 패널 에서 Holograms 폴더를 선택 합니다.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.
  • 프로젝트 패널에서 Scripts 폴더를 마우스 오른쪽 단추로 클릭 합니다.Right-click on the Scripts folder in the Project panel.
  • 만들기 하위 메뉴를 클릭 합니다.Click the Create sub-menu.
  • C # 스크립트 를 선택 합니다.Select C# Script.
  • 스크립트 이름을 WorldCursor 로 합니다.Name the script WorldCursor. 참고: 이름은 대/소문자를 구분 합니다.Note: The name is case-sensitive. .Cs 확장명을 추가할 필요가 없습니다.You do not need to add the .cs extension.
  • 계층 패널 에서 Cursor 개체를 선택 합니다.Select the Cursor object in the Hierarchy panel.
  • WorldCursor 스크립트를 검사기 패널로 끌어 놓습니다.Drag and drop the WorldCursor script into the Inspector panel.
  • WorldCursor 스크립트를 두 번 클릭 하 여 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 the cursor 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.
  • 이전에 HoloLens에 배포 하는 데 사용한 Visual Studio 솔루션으로 돌아갑니다.Return to the Visual Studio solution previously used to deploy to your HoloLens.
  • 메시지가 표시 되 면 ' 모두 다시 로드 '를 선택 합니다.Select 'Reload All' when prompted.
  • 디버그를 클릭 하 > 디버깅 하지 않고 시작 을 클릭 하거나 ctrl + F5 를 누릅니다.Click Debug -> Start Without debugging or press Ctrl + F5.
  • 이제 장면을 살펴보고 커서가 개체 모양과 상호 작용 하는 방식을 확인 합니다.Now look around the scene and 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

  • 선택 제스처를 사용 하 여 holograms를 제어 합니다.Control your holograms with the Select gesture.

지침Instructions

먼저 스크립트를 만든 다음 선택 제스처를 검색할 수 있습니다.We'll start by creating a script then can detect the Select gesture.

  • Scripts 폴더에서 GazeGestureManager 라는 스크립트를 만듭니다.In the Scripts folder, create a script named GazeGestureManager.
  • GazeGestureManager 스크립트를 계층의 OrigamiCollection 개체로 끌어 옵니다.Drag the GazeGestureManager script onto the OrigamiCollection object in the Hierarchy.
  • Visual Studio에서 GazeGestureManager 스크립트를 열고 다음 코드를 추가 합니다.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 Awake()
    {
        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 폴더에 SphereCommands 이라는 다른 스크립트를 만듭니다.Create another script in the Scripts folder, this time named SphereCommands.
  • 계층 구조 뷰에서 OrigamiCollection 개체를 확장 합니다.Expand the OrigamiCollection object in the Hierarchy view.
  • SphereCommands 스크립트를 계층 패널의 Sphere1 개체로 끌어 옵니다.Drag the SphereCommands script onto the Sphere1 object in the Hierarchy panel.
  • SphereCommands 스크립트를 계층 패널의 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 your HoloLens.
  • 구 중 하나를 확인 합니다.Look at one of the spheres.
  • 선택 제스처를 수행 하 고 아래 화면에 대 한 구 드롭다운을 시청 합니다.Perform the select gesture and watch the sphere drop onto the surface below.

4 장-음성Chapter 4 - Voice

이 장에서는 두 개의 음성 명령에 대 한 지원을 추가 합니다. "다시 설정"은 삭제 된 구를 원래 위치로 반환 하 고, "삭제 구"는 구가 되도록 합니다.In this chapter, we'll add support for two voice commands: "Reset world" to return 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 폴더에서 SpeechManager 라는 스크립트를 만듭니다.In the Scripts folder, create a script named SpeechManager.
  • SpeechManager 스크립트를 계층의 OrigamiCollection 개체로 끌어 옵니다.Drag the SpeechManager script onto the OrigamiCollection object in the Hierarchy
  • Visual Studio에서 SpeechManager 스크립트를 엽니다.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에서 SphereCommands 스크립트를 엽니다.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 your HoloLens.
  • 구 중 하나를 확인 하 고 "삭제 구" 라고 표시 합니다.Look at 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. 3D 공간에서 소리를 특정 위치에 제공 하기 위해 공간 소리 를 사용할 예정입니다.We'll be using spatial sound to give sounds a specific location in 3D space.

목표Objectives

  • 전 세계에서 holograms를 들어봅니다.Hear holograms in your world.

지침Instructions

  • Unity의 상단 메뉴에서 선택 > 프로젝트 설정 > 오디오를 편집 합니다.In Unity select from the top menu Edit > Project Settings > Audio
  • 오른쪽의 검사기 패널에서 Spatializer 플러그 인 설정을 찾아 MS hrtf Spatializer 를 선택 합니다.In the Inspector Panel on the right side, find the Spatializer Plugin setting and select MS HRTF Spatializer.
  • 프로젝트 패널의 Holograms 폴더에서 외계 개체를 계층 패널의 OrigamiCollection 개체로 끌어옵니다.From the Holograms folder in the Project panel, drag the Ambience object onto the OrigamiCollection object in the Hierarchy Panel.
  • OrigamiCollection 를 선택 하 고 검사기 패널에서 오디오 원본 구성 요소를 찾습니다.Select OrigamiCollection and find the Audio Source component in the Inspector panel. 다음 속성을 변경 합니다.Change these properties:
    • Spatialize 속성을 확인 합니다.Check the Spatialize property.
    • 절전 모드 해제를 확인 합니다.Check the Play On Awake.
    • 슬라이더를 오른쪽으로 끌어 공간 Blend3d 로 변경 합니다.Change Spatial Blend to 3D by dragging the slider all the way to the right. 슬라이더를 이동 하는 경우 값은 0에서 1로 변경 됩니다.The value should change from 0 to 1 when you move the slider.
    • Loop 속성을 선택 합니다.Check the Loop property.
    • 3D 소리 설정 을 확장 하 고 Doppler 수준 에 대해 0.1 을 입력 합니다.Expand 3D Sound Settings, and enter 0.1 for Doppler Level.
    • 볼륨 Rolloff로그 Rolloff 로 설정 합니다.Set Volume Rolloff to Logarithmic Rolloff.
    • 최대 거리20 으로 설정 합니다.Set Max Distance to 20.
  • Scripts 폴더에서 SphereSounds 라는 스크립트를 만듭니다.In the Scripts folder, create a script named SphereSounds.
  • SphereSounds 를 계층의 Sphere1Sphere2 개체로 끌어서 놓습니다.Drag and drop SphereSounds to the Sphere1 and Sphere2 objects in the Hierarchy.
  • Visual Studio에서 SphereSounds 를 열고 다음 코드를 업데이트 하 고 모두 저장 합니다.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 your HoloLens.
  • 스테이지에서 가깝게 이동 하 여 다른 쪽으로 이동 하 여 소리 변경을 기다립니다.Move closer and further from the Stage and turn side-to-side 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.
  • 가장 중요 한 위치에 holograms을 두십시오.Place your holograms where they matter most to you.

지침Instructions

  • Unity의 프로젝트 패널에서 Holograms 폴더를 클릭 합니다.In Unity, 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. 이렇게 하면 재질 그리기 값이 와이어 프레임으로 설정 됩니다.When you do this, the value for Draw Material should get set to Wireframe.
  • 앱을 내보내고, 빌드하여 HoloLens에 배포 합니다.Export, build and deploy the app to your HoloLens.
  • 앱이 실행 되 면 와이어 프레임 메쉬가 실제 세계를 오버레이 합니다.When the app runs, a wireframe mesh will overlay your real world.
  • 롤링 구가 단계를 어떻게 진행 하는지 확인 합니다.Watch how a rolling sphere will fall off the stage, and onto the floor!

이제 OrigamiCollection를 새 위치로 이동 하는 방법을 보여 드리겠습니다.Now we'll show you how to move the OrigamiCollection to a new location:

  • Scripts 폴더에서 TapToPlaceParent 라는 스크립트를 만듭니다.In the Scripts folder, create a script named TapToPlaceParent.
  • 계층 에서 OrigamiCollection 를 확장 하 고 단계 개체를 선택 합니다.In the Hierarchy, expand the OrigamiCollection and select the Stage object.
  • TapToPlaceParent 스크립트를 Stage 개체로 끌어 놓습니다.Drag the TapToPlaceParent script onto the Stage object.
  • Visual Studio에서 TapToPlaceParent 스크립트를 열고 다음으로 업데이트 합니다.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.
  • 이제 gazing을 사용 하 고, 선택 제스처를 사용 하 고, 새 위치로 이동 하 고, 선택 제스처를 다시 사용 하 여 특정 위치에 게임을 삽입할 수 있습니다.Now you should now be able to place the game in a specific location by gazing at it, using the Select gesture and then moving to a new location, and using the Select gesture again.

7 장-Holographic 재미Chapter 7 - Holographic fun

목표Objectives

  • Holographic 지 수에 대 한 입구를 표시 합니다.Reveal the entrance to a holographic underworld.

지침Instructions

이제 holographic 지 수를 파악 하는 방법을 보여 드리겠습니다.Now we'll show you how to uncover the holographic underworld:

  • 프로젝트 패널의 Holograms 폴더에서 다음을 수행 합니다.From the Holograms folder in the Project Panel:
    • 수를 계층으로 끌어 OrigamiCollection 의 자식으로 만듭니다.Drag Underworld into the Hierarchy to be a child of OrigamiCollection.
  • Scripts 폴더에서 HitTarget 라는 스크립트를 만듭니다.In the Scripts folder, create a script named HitTarget.
  • 계층 에서 OrigamiCollection 를 확장 합니다.In the Hierarchy, expand the OrigamiCollection.
  • 스테이지 개체를 확장 하 고 대상 개체 (파란색 팬)를 선택 합니다.Expand the Stage object and select the Target object (blue fan).
  • HitTarget 스크립트를 대상 개체로 끌어 옵니다.Drag the HitTarget script onto the Target object.
  • Visual Studio에서 HitTarget 스크립트를 열고 다음으로 업데이트 합니다.Open the HitTarget script in Visual Studio, and update it to be the following:
using UnityEngine;

public class HitTarget : MonoBehaviour
{
    // These public fields become settable properties in the Unity editor.
    public GameObject underworld;
    public GameObject objectToHide;

    // Occurs when this object starts colliding with another object
    void OnCollisionEnter(Collision collision)
    {
        // Hide the stage and show the underworld.
        objectToHide.SetActive(false);
        underworld.SetActive(true);

        // Disable Spatial Mapping to let the spheres enter the underworld.
        SpatialMapping.Instance.MappingEnabled = false;
    }
}
  • Unity에서 대상 개체를 선택 합니다.In Unity, select the Target object.
  • 이제 적중 대상 구성 요소에서 두 개의 공용 속성이 표시 되 고 장면에서 개체를 참조 해야 합니다.Two public properties are now visible on the Hit Target component and need to reference objects in our scene:
    • 계층 패널의속성을 적중 대상 구성 요소의 지 속성 속성으로 끌어 옵니다.Drag Underworld from the Hierarchy panel to the Underworld property on the Hit Target component.
    • 단계계층 패널에서 개체로 끌어 적중 대상 구성 요소의 속성을 숨깁니다 .Drag Stage from the Hierarchy panel to the Object to Hide property on the Hit Target component.
  • 앱을 내보내고 빌드하고 배포 합니다.Export, build and deploy the app.
  • 바닥에 종이를 놓고 선택 제스처를 사용 하 여 구를 끌어 놓습니다.Place the Origami Collection on the floor, and then use the Select gesture to make a sphere drop.
  • 구가 대상 (파란색 팬)에 도달 하면 폭발이 발생 합니다.When the sphere hits the target (blue fan), an explosion will occur. 컬렉션이 숨겨지고 지 수에 대 한 구멍이 표시 됩니다.The collection will be hidden and a hole to the underworld will appear.

The end

이 자습서의 끝입니다!And that's the end of this tutorial!

다음에 대해 알아보았습니다.You learned:

  • Unity에서 holographic 앱을 만드는 방법How to create a holographic app in Unity.
  • 응시, 제스처, 음성, 소리 및 공간 매핑을 활용 하는 방법입니다.How to make use of gaze, gesture, voice, sound, 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 experience!

참고 항목See also