Observação

Os tutoriais misturados do Academia de realidade foram projetados com o HoloLens (1º gen) e com o fone de cabeça de imersão de realidade misturada.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Como tal, achamos que é importante deixar esses tutoriais em vigor para os desenvolvedores que ainda estão procurando orientação no desenvolvimento para esses dispositivos.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. Esses tutoriais não serão atualizados com os conjuntos de ferramentas e as interações mais recentes usados para o HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Eles serão mantidos para continuar a trabalhar nos dispositivos com suporte.They will be maintained to continue working on the supported devices. Uma nova série de tutoriais foi postada para o HoloLens 2.A new series of tutorials has been posted for HoloLens 2.


Entrada MR 213: controladores de movimentoMR Input 213: Motion controllers

Os controladores de movimento no mundo da realidade misturada adicionam outro nível de interatividade.Motion controllers in the mixed reality world add another level of interactivity. Com os controladores de movimento, podemos interagir diretamente com objetos de forma mais natural, semelhante às nossas interações físicas na vida real, aumentando imersão e fascinam em sua experiência de aplicativo.With motion controllers, we can directly interact with objects in a more natural way, similar to our physical interactions in real life, increasing immersion and delight in your app experience.

No Sr Input 213, exploraremos os eventos de entrada do controlador de movimento criando uma experiência de pintura espacial simples.In MR Input 213, we will explore the motion controller's input events by creating a simple spatial painting experience. Com esse aplicativo, os usuários podem pintar em espaço tridimensional com vários tipos de pincéis e cores.With this app, users can paint in three-dimensional space with various types of brushes and colors.

Tópicos abordados neste tutorialTopics covered in this tutorial

MixedReality213 Topic1 MixedReality213 Topic2 MixedReality213 Topic3
Visualização do controladorController visualization Eventos de entrada do controladorController input events Controlador personalizado e interface do usuárioCustom controller and UI
Saiba como renderizar modelos de controlador de movimento no modo de jogo e em tempo de execução do Unity.Learn how to render motion controller models in Unity's game mode and runtime. Entenda os diferentes tipos de eventos de botão e seus aplicativos.Understand different types of button events and their applications. Saiba como sobrepor elementos de interface do usuário na parte superior do controlador ou personalizá-lo totalmente.Learn how to overlay UI elements on top of the controller or fully customize it.

Suporte a dispositivosDevice support

CourseCourse HoloLensHoloLens Headsets imersivosImmersive headsets
Entrada MR 213: controladores de movimentoMR Input 213: Motion controllers ✔️✔️

Antes de começarBefore you start

Pré-requisitosPrerequisites

Consulte a lista de verificação da instalação para headsets de imersão nesta página.See the installation checklist for immersive headsets on this page.

Arquivos de projetoProject files

Observação

Se você quiser examinar o código-fonte antes de baixá-lo, ele estará disponível no GitHub.If you want to look through the source code before downloading, it's available on GitHub.

Configuração do UnityUnity setup

ObjetivosObjectives

  • Otimizar o Unity para o desenvolvimento de realidade mista do WindowsOptimize Unity for Windows Mixed Reality development
  • Configuração da câmera de realidade misturadaSetup Mixed Reality Camera
  • Ambiente de instalaçãoSetup environment

InstruçõesInstructions

  • Inicie o Unity.Start Unity.

  • Selecione abrir.Select Open.

  • Navegue até sua área de trabalho e localize a pasta MixedReality213-Master que você desarquivou anteriormente.Navigate to your Desktop and find the MixedReality213-master folder you previously unarchived.

  • Clique em Selecionar Pasta.Click Select Folder.

  • Depois que o Unity terminar de carregar arquivos de projeto, você poderá ver o editor do Unity.Once Unity finishes loading project files, you will be able to see Unity editor.

  • No Unity, selecione arquivo > configurações de Build.In Unity, select File > Build Settings.

    MR213_BuildSettings

  • Selecione plataforma universal do Windows na lista plataforma e clique no botão alternar plataforma .Select Universal Windows Platform in the Platform list and click the Switch Platform button.

  • Definir o dispositivo de destino para qualquer dispositivoSet Target Device to Any device

  • Definir tipo de compilação como D3DSet Build Type to D3D

  • Definir o SDK para o mais recente instaladoSet SDK to Latest Installed

  • Verificar projetos C# do UnityCheck Unity C# Projects

    • Isso permite que você modifique os arquivos de script no projeto do Visual Studio sem recriar o projeto do Unity.This allows you modify script files in the Visual Studio project without rebuilding Unity project.
  • Clique em configurações do Player.Click Player Settings.

  • No painel Inspetor , role para baixo até a parte inferiorIn the Inspector panel, scroll down to the bottom

  • Em configurações de XR, verifique a realidade virtual com suporteIn XR Settings, check Virtual Reality Supported

  • Em SDKs de realidade virtual, selecione realidade mista do WindowsUnder Virtual Reality SDKs, select Windows Mixed Reality

    MR213_XRSettings

  • Feche a janela configurações de compilação .Close Build Settings window.

Estrutura do projetoProject structure

Este tutorial usa o Kit de ferramentas de realidade misturada-Unity .This tutorial uses Mixed Reality Toolkit - Unity. Você pode encontrar as versões nesta página.You can find the releases on this page.

ProjectStructure

Cenas concluídas para sua referênciaCompleted scenes for your reference

  • Você encontrará duas cenas de Unity concluídas na pasta de cenas .You will find two completed Unity scenes under Scenes folder.
    • MixedReality213: cena concluída com pincel únicoMixedReality213: Completed scene with single brush
    • MixedReality213Advanced: cena concluída para design avançado com vários pincéisMixedReality213Advanced: Completed scene for advanced design with multiple brushes

Nova configuração de cena para o tutorialNew Scene setup for the tutorial

  • No Unity, clique em arquivo > nova cenaIn Unity, click File > New Scene

  • Excluir a câmera principal e a luz direcionalDelete Main Camera and Directional Light

  • No painel Projeto, pesquise e arraste o seguinte pré-fabricados para o painel hierarquia :From the Project panel, search and drag the following prefabs into the Hierarchy panel:

    • Assets/HoloToolkit/Input/pré-fabricados/MixedRealityCameraAssets/HoloToolkit/Input/Prefabs/MixedRealityCamera
    • Ativos/AppPrefabs/ambienteAssets/AppPrefabs/Environment

    Câmera e ambiente

  • Há duas pré-fabricados de câmera no kit de ferramentas de realidade misturada:There are two camera prefabs in Mixed Reality Toolkit:

    • MixedRealityCamera. pré-fabricado: câmera somenteMixedRealityCamera.prefab: Camera only
    • MixedRealityCameraParent. pré-fabricado: câmera + Teleportation + limiteMixedRealityCameraParent.prefab: Camera + Teleportation + Boundary
    • Neste tutorial, usaremos o MixedRealityCamera sem o recurso de Teleportation.In this tutorial, we will use MixedRealityCamera without teleportation feature. Por isso, adicionamos um ambiente simples pré-fabricado que contém uma base básica para fazer com que o usuário se sinta à vontade.Because of this, we added simple Environment prefab which contains a basic floor to make the user feel grounded.
    • Para saber mais sobre a teleportabilidade com o MixedRealityCameraParent, consulte design avançado – Teleportation e LocomotionTo learn more about the teleportation with MixedRealityCameraParent, see Advanced design - Teleportation and locomotion

Configuração do SkyboxSkybox setup

  • Clique em janela > iluminação > configuraçõesClick Window > Lighting > Settings

  • Clique no círculo no lado direito do campo material de SkyboxClick the circle on the right side of the Skybox Material field

  • Digite "Gray" e selecione SkyboxGray (ativos/AppPrefabs/suporte/materiais/SkyboxGray. passe-partout)Type in ‘gray’ and select SkyboxGray (Assets/AppPrefabs/Support/Materials/SkyboxGray.mat)

    Configurando Skybox

  • Marque a opção Skybox para poder ver Skybox gradiente cinza atribuídoCheck Skybox option to be able to see assigned gray gradient skybox

    Alternar opção Skybox

  • A cena com MixedRealityCamera, ambiente e Skybox cinza terá a seguinte aparência.The scene with MixedRealityCamera, Environment and gray skybox will look like this.

    Ambiente MixedReality213

  • Clique em arquivo > salvar cena comoClick File > Save Scene as

  • Salve sua cena na pasta de cenas com qualquer nomeSave your scene under Scenes folder with any name

Capítulo 1-visualização do controladorChapter 1 - Controller visualization

ObjetivosObjectives

  • Saiba como renderizar modelos de controlador de movimento no modo de jogo do Unity e em tempo de execução.Learn how to render motion controller models in Unity's game mode and at runtime.

O Windows Mixed Reality fornece um modelo de controlador animado para a visualização do controlador.Windows Mixed Reality provides an animated controller model for controller visualization. Há várias abordagens que você pode tomar para a visualização do controlador em seu aplicativo:There are several approaches you can take for controller visualization in your app:

  • Padrão-usando o controlador padrão sem modificaçãoDefault - Using default controller without modification
  • Híbrido-usando o controlador padrão, mas Personalizando alguns de seus elementos ou sobrepondo componentes de interface do usuárioHybrid - Using default controller, but customizing some of its elements or overlaying UI components
  • Substituição-usando seu próprio modelo 3D personalizado para o controladorReplacement - Using your own customized 3D model for the controller

Neste capítulo, aprenderemos sobre os exemplos dessas personalizações do controlador.In this chapter, we will learn about the examples of these controller customizations.

InstruçõesInstructions

  • No painel projeto , digite MotionControllers na caixa de pesquisa.In the Project panel, type MotionControllers in the search box . Você também pode encontrá-lo em assets/HoloToolkit/Input/pré-fabricados/.You can also find it under Assets/HoloToolkit/Input/Prefabs/.
  • Arraste MotionControllers pré-fabricado para o painel hierarquia .Drag the MotionControllers prefab into the Hierarchy panel.
  • Clique em MotionControllers pré-fabricado no painel hierarquia .Click on the MotionControllers prefab in the Hierarchy panel.

MotionControllers pré-fabricadoMotionControllers prefab

MotionControllers pré-fabricado tem um script MotionControllerVisualizer que fornece os slots para modelos de controlador alternativos.MotionControllers prefab has a MotionControllerVisualizer script which provides the slots for alternate controller models. Se você atribuir seus próprios modelos 3D personalizados, como uma mão ou um gumes, e marcar a opção ' sempre usar o modelo alternativo esquerdo/direito ', você os verá em vez do modelo padrão.If you assign your own custom 3D models such as a hand or a sword and check 'Always Use Alternate Left/Right Model', you will see them instead of the default model. Usaremos esse slot no capítulo 4 para substituir o modelo do controlador por um pincel.We will use this slot in Chapter 4 to replace the controller model with a brush.

MR213_ControllerVisualizer

SobreInstructions

  • No painel Inspetor , clique duas vezes em script MotionControllerVisualizer para ver o código no Visual StudioIn the Inspector panel, double click MotionControllerVisualizer script to see the code in the Visual Studio

Script MotionControllerVisualizerMotionControllerVisualizer script

As classes MotionControllerVisualizer e MotionControllerInfo fornecem os meios para acessar & modificar os modelos de controlador padrão.The MotionControllerVisualizer and MotionControllerInfo classes provide the means to access & modify the default controller models. MotionControllerVisualizer assina o evento InteractionSourceDetected do Unity e instancia automaticamente os modelos do controlador quando eles são encontrados.MotionControllerVisualizer subscribes to Unity's InteractionSourceDetected event and automatically instantiates controller models when they are found.

protected override void Awake()
{
    ...
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    ...
}

Os modelos de controlador são fornecidos de acordo com a especificação glTF.The controller models are delivered according to the glTF specification. Esse formato foi criado para fornecer um formato comum, ao mesmo tempo em que melhora o processo por trás da transmissão e desempacotamento de ativos 3D.This format has been created to provide a common format, while improving the process behind transmitting and unpacking 3D assets. Nesse caso, precisamos recuperar e carregar os modelos de controlador em tempo de execução, pois queremos tornar a experiência do usuário o mais direta possível e não há garantia de qual versão dos controladores de movimento o usuário pode estar usando.In this case, we need to retrieve and load the controller models at runtime, as we want to make the user's experience as seamless as possible, and it's not guaranteed which version of the motion controllers the user might be using. Este curso, por meio do kit de ferramentas de realidade misturada, usa uma versão do projeto UnityGLTFdo grupo Khronos.This course, via the Mixed Reality Toolkit, uses a version of the Khronos Group's UnityGLTF project.

Depois que o controlador foi entregue, os scripts podem usar o MotionControllerInfo para localizar as transformações de elementos específicos do controlador para que eles possam se posicionar corretamente.Once the controller has been delivered, scripts can use MotionControllerInfo to find the transforms for specific controller elements so they can correctly position themselves.

Em um capítulo posterior, veremos como usar esses scripts para anexar elementos de interface do usuário aos controladores.In a later chapter, we will learn how to use these scripts to attach UI elements to the controllers.

Em alguns scripts, você encontrará blocos de código com #if! UNITY_EDITOR ou UNITY_WSA. Esses blocos de código são executados somente no tempo de execução do UWP quando você implanta no Windows. Isso ocorre porque o conjunto de APIs usado pelo editor do Unity e o tempo de execução do aplicativo UWP são diferentes.In some scripts, you will find code blocks with #if !UNITY_EDITOR or UNITY_WSA. These code blocks run only on the UWP runtime when you deploy to Windows. This is because the set of APIs used by the Unity editor and the UWP app runtime are different.

  • Salve a cena e clique no botão reproduzir .Save the scene and click the play button.

Você poderá ver a cena com os controladores de movimento em seu headset.You will be able to see the scene with motion controllers in your headset. Você pode ver animações detalhadas para cliques de botão, movimentação de Thumbstick e realce de toque do touchpad.You can see detailed animations for button clicks, thumbstick movement, and touchpad touch highlighting.

Padrão de visualização de MR213_Controller

Capítulo 2-anexando elementos da interface do usuário ao controladorChapter 2 - Attaching UI elements to the controller

ObjetivosObjectives

  • Saiba mais sobre os elementos dos controladores de movimentoLearn about the elements of the motion controllers
  • Saiba como anexar objetos a partes específicas dos controladoresLearn how to attach objects to specific parts of the controllers

Neste capítulo, você aprenderá a adicionar elementos de interface do usuário ao controlador que o usuário pode acessar e manipular facilmente a qualquer momento.In this chapter, you will learn how to add user interface elements to the controller which the user can easily access and manipulate at anytime. Você também aprenderá a adicionar uma interface do usuário de seletor de cor simples usando a entrada do touchpad.You will also learn how to add a simple color picker UI using the touchpad input.

InstruçõesInstructions

  • No painel projeto , pesquise o script MotionControllerInfo .In the Project panel, search MotionControllerInfo script.
  • No resultado da pesquisa, clique duas vezes em MotionControllerInfo script para ver o código no Visual Studio.From the search result, double click MotionControllerInfo script to see the code in Visual Studio.

Script MotionControllerInfoMotionControllerInfo script

A primeira etapa é escolher o elemento do controlador ao qual você deseja que a interface do usuário seja anexada.The first step is to choose which element of the controller you want the UI to attach to. Esses elementos são definidos em ControllerElementEnum em MotionControllerInfo.cs.These elements are defined in ControllerElementEnum in MotionControllerInfo.cs.

MR213 MotionControllerElements

  • CasaHome
  • AdicionarMenuMenu
  • CompreendiGrasp
  • ThumbstickThumbstick
  • NãoSelect
  • TouchpadTouchpad
  • Pose de ponteiro – esse elemento representa a ponta da direção do encaminhamento do controlador.Pointing pose – this element represents the tip of the controller pointing forward direction.

SobreInstructions

  • No painel projeto , pesquise o script AttachToController .In the Project panel, search AttachToController script.
  • No resultado da pesquisa, clique duas vezes em AttachToController script para ver o código no Visual Studio.From the search result, double click AttachToController script to see the code in Visual Studio.

Script AttachToControllerAttachToController script

O script AttachToController fornece uma maneira simples de anexar quaisquer objetos a um elemento e destro/canhoto do controlador especificado.The AttachToController script provides a simple way to attach any objects to a specified controller handedness and element.

Em AttachElementToController () ,In AttachElementToController(),

  • Confira destromente usando MotionControllerInfo. destrolyCheck handedness using MotionControllerInfo.Handedness
  • Obter um elemento específico do controlador usando MotionControllerInfo. TryGetElement ()Get specific element of the controller using MotionControllerInfo.TryGetElement()
  • Depois de recuperar a transformação do elemento do modelo do controlador, pai o objeto abaixo dele e definir a posição local do objeto & rotação como zero.After retrieving the element's transform from the controller model, parent the object under it and set object's local position & rotation to zero.
public MotionControllerInfo.ControllerElementEnum Element { get { return element; } }

private void AttachElementToController(MotionControllerInfo newController)
{
     if (!IsAttached && newController.Handedness == handedness)
     {
          if (!newController.TryGetElement(element, out elementTransform))
          {
               Debug.LogError("Unable to find element of type " + element + " under controller " + newController.ControllerParent.name + "; not attaching.");
               return;
          }

          controller = newController;

          SetChildrenActive(true);

          // Parent ourselves under the element and set our offsets
          transform.parent = elementTransform;
          transform.localPosition = positionOffset;
          transform.localEulerAngles = rotationOffset;
          if (setScaleOnAttach)
          {
               transform.localScale = scale;
          }

          // Announce that we're attached
          OnAttachToController();
          IsAttached = true;
     }
}

A maneira mais simples de usar o script AttachToController é herdar dele, como fizemos no caso de ColorPickerWheel.The simplest way to use AttachToController script is to inherit from it, as we've done in the case of ColorPickerWheel. Basta substituir as funções OnAttachToController e OnDetachFromController para executar sua configuração/divisão quando o controlador for detectado/desconectado.Simply override the OnAttachToController and OnDetachFromController functions to perform your setup / breakdown when the controller is detected / disconnected.

SobreInstructions

  • No painel projeto , digite na caixa de pesquisa ColorPickerWheel.In the Project panel, type in the search box ColorPickerWheel. Você também pode encontrá-lo em ativos/AppPrefabs/.You can also find it under Assets/AppPrefabs/.
  • Arraste ColorPickerWheel pré-fabricado para o painel hierarquia .Drag ColorPickerWheel prefab into the Hierarchy panel.
  • Clique no ColorPickerWheel pré-fabricado no painel hierarquia .Click the ColorPickerWheel prefab in the Hierarchy panel.
  • No painel Inspetor , clique duas vezes em ColorPickerWheel script para ver o código no Visual Studio.In the Inspector panel, double click ColorPickerWheel Script to see the code in Visual Studio.

ColorPickerWheel pré-fabricado

Script ColorPickerWheelColorPickerWheel script

Como ColorPickerWheel herda AttachToController, ele mostra destroly e Element no painel de inspetores .Since ColorPickerWheel inherits AttachToController, it shows Handedness and Element in the Inspector panel. Vamos anexar a interface do usuário ao elemento Touchpad no controlador à esquerda.We'll be attaching the UI to the Touchpad element on the left controller.

Script ColorPickerWheel

ColorPickerWheel substitui o OnAttachToController e o OnDetachFromController para assinar o evento de entrada que será usado no próximo capítulo para seleção de cores com entrada do touchpad.ColorPickerWheel overrides the OnAttachToController and OnDetachFromController to subscribe to the input event which will be used in next chapter for color selection with touchpad input.

public class ColorPickerWheel : AttachToController, IPointerTarget
{
    protected override void OnAttachToController()
    {
        // Subscribe to input now that we're parented under the controller
        InteractionManager.InteractionSourceUpdated += InteractionSourceUpdated;
    }

    protected override void OnDetachFromController()
    {
        Visible = false;

        // Unsubscribe from input now that we've detached from the controller
        InteractionManager.InteractionSourceUpdated -= InteractionSourceUpdated;
    }
    ...
}
  • Salve a cena e clique no botão reproduzir .Save the scene and click the play button.

Método alternativo para anexar objetos aos controladoresAlternative method for attaching objects to the controllers

É recomendável que seus scripts herdem de AttachToController e substituam OnAttachToController.We recommend that your scripts inherit from AttachToController and override OnAttachToController. No entanto, isso nem sempre pode ser possível.However, this may not always be possible. Uma alternativa é usá-lo como um componente autônomo.An alternative is using it as a standalone component. Isso pode ser útil quando você deseja anexar um pré-fabricado existente a um controlador sem refatorar seus scripts.This can be useful when you want to attach an existing prefab to a controller without refactoring your scripts. Basta ter a sua classe aguardar que isanexou seja definido como true antes de executar qualquer configuração.Simply have your class wait for IsAttached to be set to true before performing any setup. A maneira mais simples de fazer isso é usando uma corrotina para ' Iniciar '.The simplest way to do this is by using a coroutine for 'Start.'

private IEnumerator Start() {
    AttachToController attach = gameObject.GetComponent<AttachToController>();

    while (!attach.IsAttached) {
        yield return null;
    }

    // Perform setup here
}

Capítulo 3-trabalhando com entrada do TouchpadChapter 3 - Working with touchpad input

ObjetivosObjectives

  • Saiba como obter eventos de dados de entrada do TouchpadLearn how to get touchpad input data events
  • Saiba como usar informações de posição do eixo do Touchpad para sua experiência de aplicativoLearn how to use touchpad axis position information for your app experience

InstruçõesInstructions

  • No painel hierarquia , clique em ColorPickerWheelIn the Hierarchy panel, click ColorPickerWheel
  • No painel Inspetor , em Animator, clique duas vezes em ColorPickerWheelControllerIn the Inspector panel, under Animator, double click ColorPickerWheelController
  • Você poderá ver a guia Animator abertaYou will be able to see Animator tab opened

Mostrando/ocultando a interface do usuário com o controlador de animação do UnityShowing/hiding UI with Unity's Animation controller

Para mostrar e ocultar a interface do usuário do amColorPickerWheel com animação, estamos usando o sistema de animação do Unity.To show and hide the ColorPickerWheel UI with animation, we are using Unity's animation system. Definir a propriedade Visible do ColorPickerWheelcomo true ou false triggers mostra e oculta os gatilhos de animação.Setting the ColorPickerWheel's Visible property to true or false triggers Show and Hide animation triggers. Os parâmetros show e Hide são definidos no controlador de animação ColorPickerWheelController .Show and Hide parameters are defined in the ColorPickerWheelController animation controller.

Controlador de animação Unity

SobreInstructions

  • No painel hierarquia , selecione ColorPickerWheel pré-fabricadoIn the Hierarchy panel, select ColorPickerWheel prefab
  • No painel Inspetor , clique duas vezes em script ColorPickerWheel para ver o código no Visual StudioIn the Inspector panel, double click ColorPickerWheel script to see the code in the Visual Studio

Script ColorPickerWheelColorPickerWheel script

ColorPickerWheel assina o evento InteractionSourceUpdated do Unity para escutar eventos do touchpad.ColorPickerWheel subscribes to Unity's InteractionSourceUpdated event to listen for touchpad events.

Em InteractionSourceUpdated () , o script primeiro verifica se ele:In InteractionSourceUpdated(), the script first checks to ensure that it:

  • é, na verdade, um evento de Touchpad (obj. State. touchpadTouched)is actually a touchpad event (obj.state.touchpadTouched)
  • origina-se do controlador à esquerda (obj. State. Source. destro/canhoto)originates from the left controller (obj.state.source.handedness)

Se ambos forem verdadeiros, a posição do Touchpad (obj. State. touchpadPosition) é atribuído a selectorPosition.If both are true, the touchpad position (obj.state.touchpadPosition) is assigned to selectorPosition.

private void InteractionSourceUpdated(InteractionSourceUpdatedEventArgs obj)
{
    if (obj.state.source.handedness == handedness && obj.state.touchpadTouched)
    {
        Visible = true;
        selectorPosition = obj.state.touchpadPosition;
    }
}

Em Update () , com base na propriedade Visible , ele dispara mostrar e ocultar gatilhos de animação no componente Animator do seletor de coresIn Update(), based on visible property, it triggers Show and Hide animation triggers in the color picker's animator component

if (visible != visibleLastFrame)
{
    if (visible)
    {
        animator.SetTrigger("Show");
    }
    else
    {
        animator.SetTrigger("Hide");
    }
}

Em Update () , selectorPosition é usado para converter um raio no Colisor de malha da roda de cores, que retorna uma posição UV.In Update(), selectorPosition is used to cast a ray at the color wheel's mesh collider, which returns a UV position. Essa posição pode ser usada para localizar a coordenada de pixel e o valor de cor da textura da roda de cores.This position can then be used to find the pixel coordinate and color value of the color wheel's texture. Esse valor é acessível a outros scripts por meio da propriedade SelectedColor .This value is accessible to other scripts via the SelectedColor property.

Seletor de cores raycasting de roda

...
    // Clamp selector position to a radius of 1
    Vector3 localPosition = new Vector3(selectorPosition.x * inputScale, 0.15f, selectorPosition.y * inputScale);
    if (localPosition.magnitude > 1)
    {
        localPosition = localPosition.normalized;
    }
    selectorTransform.localPosition = localPosition;

    // Raycast the wheel mesh and get its UV coordinates
    Vector3 raycastStart = selectorTransform.position + selectorTransform.up * 0.15f;
    RaycastHit hit;
    Debug.DrawLine(raycastStart, raycastStart - (selectorTransform.up * 0.25f));

    if (Physics.Raycast(raycastStart, -selectorTransform.up, out hit, 0.25f, 1 << colorWheelObject.layer, QueryTriggerInteraction.Ignore))
    {
        // Get pixel from the color wheel texture using UV coordinates
        Vector2 uv = hit.textureCoord;
        int pixelX = Mathf.FloorToInt(colorWheelTexture.width * uv.x);
        int pixelY = Mathf.FloorToInt(colorWheelTexture.height * uv.y);
        selectedColor = colorWheelTexture.GetPixel(pixelX, pixelY);
        selectedColor.a = 1f;
    }
    // Set the selector's color and blend it with white to make it visible on top of the wheel
    selectorRenderer.material.color = Color.Lerp (selectedColor, Color.white, 0.5f);
}

Capítulo 4-substituindo modelo de controladorChapter 4 - Overriding controller model

ObjetivosObjectives

  • Saiba como substituir o modelo do controlador por um modelo 3D personalizado.Learn how to override the controller model with a custom 3D model.

MR213_BrushToolOverride

InstruçõesInstructions

  • Clique em MotionControllers no painel hierarquia .Click MotionControllers in the Hierarchy panel.
  • Clique no círculo no lado direito do campo controlador alternativo direito .Click the circle on the right side of the Alternate Right Controller field.
  • Digite ' BrushController' e selecione o pré-fabricado do resultado.Type in 'BrushController' and select the prefab from the result. Você pode encontrá-lo em ativos/AppPrefabs/BrushController.You can find it under Assets/AppPrefabs/BrushController.
  • Marque sempre usar modelo alternativo corretoCheck Always Use Alternate Right Model

MR213_BrushToolOverrideSlot

O BrushController pré-fabricado não precisa ser incluído no painel hierarquia .The BrushController prefab does not have to be included in the Hierarchy panel. No entanto, para conferir seus componentes filho:However, to check out its child components:

  • No painel projeto , digite BrushController e arraste BrushController pré-fabricado para o painel hierarquia .In the Project panel, type in BrushController and drag BrushController prefab into the Hierarchy panel.

MR213_BrushTool_Prefab2

Você encontrará o componente de dica em BrushController.You will find the Tip component in BrushController. Usaremos sua transformação para iniciar/parar as linhas de desenho.We will use its transform to start/stop drawing lines.

  • Exclua o BrushController do painel hierarquia .Delete the BrushController from the Hierarchy panel.
  • Salve a cena e clique no botão reproduzir .Save the scene and click the play button. Você poderá ver o modelo de pincel substituiu o controlador de movimento à direita.You will be able to see the brush model replaced the right-hand motion controller.

Capítulo 5-pintura com selecionar entradaChapter 5 - Painting with Select input

ObjetivosObjectives

  • Saiba como usar o evento de botão SELECT para iniciar e parar um desenho de linhaLearn how to use the Select button event to start and stop a line drawing

InstruçõesInstructions

  • Pesquise BrushController pré-fabricado no painel de projeto .Search BrushController prefab in the Project panel.
  • No painel Inspetor , clique duas vezes em script BrushController para ver o código no Visual StudioIn the Inspector panel, double click BrushController Script to see the code in Visual Studio

Script BrushControllerBrushController script

BrushController assina os eventos InteractionSourcePressed e InteractionSourceReleased de interactionmanager.BrushController subscribes to the InteractionManager's InteractionSourcePressed and InteractionSourceReleased events. Quando o evento InteractionSourcePressed é disparado, a propriedade draw do pincel é definida como true; Quando o evento InteractionSourceReleased é disparado, a propriedade draw do pincel é definida como false.When InteractionSourcePressed event is triggered, the brush's Draw property is set to true; when InteractionSourceReleased event is triggered, the brush's Draw property is set to false.

private void InteractionSourcePressed(InteractionSourcePressedEventArgs obj)
{
    if (obj.state.source.handedness == InteractionSourceHandedness.Right && obj.pressType == InteractionSourcePressType.Select)
    {
        Draw = true;
    }
}

private void InteractionSourceReleased(InteractionSourceReleasedEventArgs obj)
{
    if (obj.state.source.handedness == InteractionSourceHandedness.Right && obj.pressType == InteractionSourcePressType.Select)
    {
        Draw = false;
    }
}

Enquanto draw estiver definido como true, o pincel gerará pontos em um LineRendererde Unity instanciado.While Draw is set to true, the brush will generate points in an instantiated Unity LineRenderer. Uma referência a esse pré-fabricado é mantida no campo de pré-fabricado de traço do pincel.A reference to this prefab is kept in the brush's Stroke Prefab field.

private IEnumerator DrawOverTime()
{
    // Get the position of the tip
    Vector3 lastPointPosition = tip.position;

    ...

    // Create a new brush stroke
    GameObject newStroke = Instantiate(strokePrefab);
    LineRenderer line = newStroke.GetComponent<LineRenderer>();
    newStroke.transform.position = startPosition;
    line.SetPosition(0, tip.position);
    float initialWidth = line.widthMultiplier;

    // Generate points in an instantiated Unity LineRenderer
    while (draw)
    {
        // Move the last point to the draw point position
        line.SetPosition(line.positionCount - 1, tip.position);
        line.material.color = colorPicker.SelectedColor;
        brushRenderer.material.color = colorPicker.SelectedColor;
        lastPointAddedTime = Time.unscaledTime;
        // Adjust the width between 1x and 2x width based on strength of trigger pull
        line.widthMultiplier = Mathf.Lerp(initialWidth, initialWidth * 2, width);

        if (Vector3.Distance(lastPointPosition, tip.position) > minPositionDelta || Time.unscaledTime > lastPointAddedTime + maxTimeDelta)
        {
            // Spawn a new point
            lastPointAddedTime = Time.unscaledTime;
            lastPointPosition = tip.position;
            line.positionCount += 1;
            line.SetPosition(line.positionCount - 1, lastPointPosition);
        }
        yield return null;
    }
}

Para usar a cor atualmente selecionada na interface do usuário da roda do seletor de cores, BrushController precisa ter uma referência ao objeto ColorPickerWheel .To use the currently selected color from the color picker wheel UI, BrushController needs to have a reference to the ColorPickerWheel object. Como o BrushController pré-fabricado é instanciado em tempo de execução como um controlador de substituição, todas as referências a objetos na cena precisarão ser definidas em tempo de execução.Because the BrushController prefab is instantiated at runtime as a replacement controller, any references to objects in the scene will have to be set at runtime. Nesse caso, usamos gameobject. FindObjectOfType para localizar o ColorPickerWheel:In this case we use GameObject.FindObjectOfType to locate the ColorPickerWheel:

private void OnEnable()
{
    // Locate the ColorPickerWheel
    colorPicker = FindObjectOfType<ColorPickerWheel>();

    // Assign currently selected color to the brush’s material color
    brushRenderer.material.color = colorPicker.SelectedColor;
    ...
}
  • Salve a cena e clique no botão reproduzir .Save the scene and click the play button. Você poderá desenhar as linhas e pintar usando o botão Selecionar no controlador à direita.You will be able to draw the lines and paint using the select button on the right-hand controller.

Capítulo 6-gerando objeto com a entrada SELECTChapter 6 - Object spawning with Select input

ObjetivosObjectives

  • Saiba como usar os eventos de entrada do botão Selecionar e entenderLearn how to use Select and Grasp button input events
  • Saiba como criar uma instância de objetosLearn how to instantiate objects

InstruçõesInstructions

  • No painel projeto , digite objectgerador na caixa de pesquisa.In the Project panel, type ObjectSpawner in the search box. Você também pode encontrá-lo em ativos/AppPrefabs/You can also find it under Assets/AppPrefabs/

  • Arraste o Objectgerador pré-fabricado para o painel hierarquia .Drag the ObjectSpawner prefab into the Hierarchy panel.

  • Clique em Objectgerador no painel hierarquia .Click ObjectSpawner in the Hierarchy panel.

  • Objectgerador tem um campo denominado fonte de cores.ObjectSpawner has a field named Color Source.

  • No painel hierarquia , arraste a referência ColorPickerWheel para esse campo.From the Hierarchy panel, drag the ColorPickerWheel reference into this field.

    Inspetor de objeto

  • Clique no pré-fabricado do Objectgerador no painel hierarquia .Click the ObjectSpawner prefab in the Hierarchy panel.

  • No painel Inspetor , clique duas vezes em script de objectgerador para ver o código no Visual Studio.In the Inspector panel, double click ObjectSpawner Script to see the code in Visual Studio.

Script objectgeradorObjectSpawner script

O Objectgerador instancia cópias de uma malha primitiva (cubo, esfera, cilindro) para o espaço.The ObjectSpawner instantiates copies of a primitive mesh (cube, sphere, cylinder) into the space. Quando um InteractionSourcePressed é detectado, ele verifica a destro/canhoto e, se for um evento InteractionSourcePressType. Segure ou InteractionSourcePressType. Select .When a InteractionSourcePressed is detected it checks the handedness and if it's an InteractionSourcePressType.Grasp or InteractionSourcePressType.Select event.

Para um evento Segure , ele incrementa o índice do tipo de malha atual (Sphere, Cube, cilindro)For a Grasp event, it increments the index of current mesh type (sphere, cube, cylinder)

private void InteractionSourcePressed(InteractionSourcePressedEventArgs obj)
{
    // Check handedness, see if it is left controller
    if (obj.state.source.handedness == handedness)
    {
        switch (obj.pressType)
        {
            // If it is Select button event, spawn object
            case InteractionSourcePressType.Select:
                if (state == StateEnum.Idle)
                {
                    // We've pressed the grasp - enter spawning state
                    state = StateEnum.Spawning;
                    SpawnObject();
                }
                break;

            // If it is Grasp button event
            case InteractionSourcePressType.Grasp:

                // Increment the index of current mesh type (sphere, cube, cylinder)
                meshIndex++;
                if (meshIndex >= NumAvailableMeshes)
                {
                    meshIndex = 0;
                }
                break;

            default:
                break;
        }
    }
}

Para um evento Select , em CodeObject () , um novo objeto é instanciado, não pai e liberado no mundo.For a Select event, in SpawnObject(), a new object is instantiated, un-parented and released into the world.

private void SpawnObject()
{
    // Instantiate the spawned object
    GameObject newObject = Instantiate(displayObject.gameObject, spawnParent);
    // Detach the newly spawned object
    newObject.transform.parent = null;
    // Reset the scale transform to 1
    scaleParent.localScale = Vector3.one;
    // Set its material color so its material gets instantiated
    newObject.GetComponent<Renderer>().material.color = colorSource.SelectedColor;
}

O Objectgerador usa o ColorPickerWheel para definir a cor do material do objeto de exibição.The ObjectSpawner uses the ColorPickerWheel to set the color of the display object's material. Os objetos gerados recebem uma instância desse material para que eles retenham sua cor.Spawned objects are given an instance of this material so they will retain their color.

  • Salve a cena e clique no botão reproduzir .Save the scene and click the play button.

Você poderá alterar os objetos com o botão compreender e gerar objetos com o botão Selecionar.You will be able to change the objects with the Grasp button and spawn objects with the Select button.

Criar e implantar o aplicativo no portal de realidade misturadaBuild and deploy app to Mixed Reality Portal

  • No Unity, selecione arquivo > configurações de Build.In Unity, select File > Build Settings.
  • Clique em Adicionar abrir cenas para adicionar a cena atual às cenas na compilação.Click Add Open Scenes to add current scene to the Scenes In Build.
  • Clique em Compilar.Click Build.
  • Crie uma nova pasta chamada "app".Create a New Folder named "App".
  • Clique uma vez na pasta do aplicativo .Single click the App folder.
  • Clique em Selecionar Pasta.Click Select Folder.
  • Quando o Unity for concluído, uma janela Explorador de arquivos será exibida.When Unity is done, a File Explorer window will appear.
  • Abra a pasta do aplicativo .Open the App folder.
  • Clique duas vezes em arquivo de solução do Visual Studio YourSceneName. sln .Double click YourSceneName.sln Visual Studio Solution file.
  • Usando a barra de ferramentas superior no Visual Studio, altere o destino de debug para Release e de ARM para x64.Using the top toolbar in Visual Studio, change the target from Debug to Release and from ARM to X64.
  • Clique na seta suspensa ao lado do botão dispositivo e selecione computador local.Click on the drop-down arrow next to the Device button, and select Local Machine.
  • Clique em depurar-> iniciar sem Depurar no menu ou pressione Ctrl + F5.Click Debug -> Start Without debugging in the menu or press Ctrl + F5.

Agora, o aplicativo é criado e instalado no portal de realidade misturada.Now the app is built and installed in Mixed Reality Portal. Você pode iniciá-lo novamente por meio do menu iniciar no portal de realidade misturada.You can launch it again through Start menu in Mixed Reality Portal.

Design avançado – ferramentas de pincel com layout radialAdvanced design - Brush tools with radial layout

MixedReality213 principal

Neste capítulo, você aprenderá a substituir o modelo de controlador de movimento padrão por uma coleção de ferramentas de pincel personalizada.In this chapter, you will learn how to replace the default motion controller model with a custom brush tool collection. Para sua referência, você pode encontrar o MixedReality213Advanced de cena concluído na pasta de cenas .For your reference, you can find the completed scene MixedReality213Advanced under Scenes folder.

InstruçõesInstructions

  • No painel projeto , digite BrushSelector na caixa de pesquisa.In the Project panel, type BrushSelector in the search box . Você também pode encontrá-lo em ativos/AppPrefabs/You can also find it under Assets/AppPrefabs/

  • Arraste BrushSelector pré-fabricado para o painel hierarquia .Drag the BrushSelector prefab into the Hierarchy panel.

  • Para a organização, crie um gameobject vazio chamado pincéisFor organization, create an empty GameObject called Brushes

  • Arraste o pré-fabricados a seguir do painel de projeto para pincéisDrag following prefabs from the Project panel into Brushes

    • Ativos/AppPrefabs/BrushFatAssets/AppPrefabs/BrushFat
    • Ativos/AppPrefabs/BrushThinAssets/AppPrefabs/BrushThin
    • Ativos/AppPrefabs/borrachaAssets/AppPrefabs/Eraser
    • Ativos/AppPrefabs/MarkerFatAssets/AppPrefabs/MarkerFat
    • Ativos/AppPrefabs/MarkerThinAssets/AppPrefabs/MarkerThin
    • Ativos/AppPrefabs/lápisAssets/AppPrefabs/Pencil

    Pincéis

  • Clique em MotionControllers pré-fabricado no painel hierarquia .Click MotionControllers prefab in the Hierarchy panel.

  • No painel Inspetor , desmarque sempre usar o modelo alternativo à direita no Visualizador do controlador de movimentoIn the Inspector panel, uncheck Always Use Alternate Right Model on the Motion Controller Visualizer

  • No painel hierarquia , clique em BrushSelectorIn the Hierarchy panel, click BrushSelector

  • BrushSelector tem um campo chamado ColorPickerBrushSelector has a field named ColorPicker

  • No painel hierarquia , arraste o ColorPickerWheel para o campo ColorPicker no painel Inspetor .From the Hierarchy panel, drag the ColorPickerWheel into ColorPicker field in the Inspector panel.

    Atribuir ColorPickerWheel ao seletor de pincel

  • No painel hierarquia , em BrushSelector pré-fabricado, selecione o objeto de menu .In the Hierarchy panel, under BrushSelector prefab, select the Menu object.

  • No painel Inspetor , no componente LineObjectCollection , abra a lista suspensa objetos matriz.In the Inspector panel, under the LineObjectCollection component, open the Objects array dropdown. Você verá seis slots vazios.You will see 6 empty slots.

  • No painel hierarquia , arraste cada um dos pré-fabricados pais sob os pincéis gameobject nesses slots em qualquer ordem.From the Hierarchy panel, drag each of the prefabs parented under the Brushes GameObject into these slots in any order. (Certifique-se de que você está arrastando o pré-fabricados da cena, não o pré-fabricados na pasta do projeto.)(Make sure you're dragging the prefabs from the scene, not the prefabs in the project folder.)

Seletor de pincel

BrushSelector pré-fabricadoBrushSelector prefab

Como o BrushSelector herda AttachToController, ele mostra opções de redireção e elemento no painel Inspetor .Since the BrushSelector inherits AttachToController, it shows Handedness and Element options in the Inspector panel. Selecionamos direita e apontando para a pose para anexar ferramentas de pincel ao controlador à direita com direção de encaminhamento.We selected Right and Pointing Pose to attach brush tools to the right hand controller with forward direction.

O BrushSelector usa dois utilitários:The BrushSelector makes use of two utilities:

  • Ellipse: usada para gerar pontos no espaço ao longo de uma forma Ellipse.Ellipse: used to generate points in space along an ellipse shape.
  • LineObjectCollection: distribui objetos usando os pontos gerados por qualquer classe de linha (por exemplo, Ellipse).LineObjectCollection: distributes objects using the points generated by any Line class (eg, Ellipse). Isso é o que usaremos para colocar nossos pincéis ao longo da forma de elipse.This is what we'll be using to place our brushes along the Ellipse shape.

Quando combinados, esses utilitários podem ser usados para criar um menu radial.When combined, these utilities can be used to create a radial menu.

Script LineObjectCollectionLineObjectCollection script

LineObjectCollection tem controles para o tamanho, a posição e a rotação de objetos distribuídos ao longo de sua linha.LineObjectCollection has controls for the size, position and rotation of objects distributed along its line. Isso é útil para criar menus radiais como o seletor de pincel.This is useful for creating radial menus like the brush selector. Para criar a aparência de pincéis que se expandem de nada à medida que eles se aproximam da posição selecionada central, os picos de curva de objectscale no centro e nas fitas são desativados nas bordas.To create the appearance of brushes that scale up from nothing as they approach the center selected position, the ObjectScale curve peaks in the center and tapers off at the edges.

Script BrushSelectorBrushSelector script

No caso do BrushSelector, optamos por usar a animação de procedimento.In the case of the BrushSelector, we've chosen to use procedural animation. Primeiro, os modelos de pincel são distribuídos em uma elipse pelo script LineObjectCollection .First, brush models are distributed in an ellipse by the LineObjectCollection script. Em seguida, cada pincel é responsável por manter sua posição na mão do usuário com base em seu valor de DisplayMode , que é alterado com base na seleção.Then, each brush is responsible for maintaining its position in the user's hand based on its DisplayMode value, which changes based on the selection. Escolhemos uma abordagem de procedimento devido à alta probabilidade de transições de posição de pincel serem interrompidas à medida que o usuário seleciona pincéis.We chose a procedural approach because of the high probability of brush position transitions being interrupted as the user selects brushes. As animações Mecanim podem lidar com as interrupções normalmente, mas tendem a ser mais complicadas do que uma operação simples de Lerp.Mecanim animations can handle interruptions gracefully, but it tends to be more complicated than a simple Lerp operation.

BrushSelector usa uma combinação de ambos.BrushSelector uses a combination of both. Quando a entrada do Touchpad é detectada, as opções de pincel tornam-se visíveis e escaladas para cima ao longo do menu radial.When touchpad input is detected, brush options become visible and scale up along the radial menu. Após um período de tempo limite (que indica que o usuário fez uma seleção), as opções de pincel são reduzidas novamente, deixando apenas o pincel selecionado.After a timeout period (which indicates that the user has made a selection) the brush options scale down again, leaving only the selected brush.

Visualizando entrada do TouchpadVisualizing touchpad input

Mesmo nos casos em que o modelo do controlador foi completamente substituído, pode ser útil mostrar a entrada nas entradas do modelo original.Even in cases where the controller model has been completely replaced, it can be helpful to show input on the original model inputs. Isso ajuda a aterrar as ações do usuário na realidade.This helps to ground the user's actions in reality. Para o BrushSelector , escolhemos tornar o touchpad visível brevemente quando a entrada é recebida.For the BrushSelector we've chosen to make the touchpad briefly visible when the input is received. Isso foi feito recuperando o elemento Touchpad do controlador, substituindo seu material por um material personalizado e aplicando um gradiente à cor desse material com base na última vez que a entrada do Touchpad foi recebida.This was done by retrieving the Touchpad element from the controller, replacing its material with a custom material, then applying a gradient to that material's color based on the last time touchpad input was received.

protected override void OnAttachToController()
{
    // Turn off the default controller's renderers
    controller.SetRenderersVisible(false);

    // Get the touchpad and assign our custom material to it
    Transform touchpad;
    if (controller.TryGetElement(MotionControllerInfo.ControllerElementEnum.Touchpad, out touchpad))
    {
        touchpadRenderer = touchpad.GetComponentInChildren<MeshRenderer>();
        originalTouchpadMaterial = touchpadRenderer.material;
        touchpadRenderer.material = touchpadMaterial;
        touchpadRenderer.enabled = true;
    }

    // Subscribe to input now that we're parented under the controller
    InteractionManager.InteractionSourceUpdated += InteractionSourceUpdated;
}

private void Update()
{
    ...
    // Update our touchpad material
    Color glowColor = touchpadColor.Evaluate((Time.unscaledTime - touchpadTouchTime) / touchpadGlowLossTime);
    touchpadMaterial.SetColor("_EmissionColor", glowColor);
    touchpadMaterial.SetColor("_Color", glowColor);
    ...
}

Seleção da ferramenta pincel com entrada do TouchpadBrush tool selection with touchpad input

Quando o seletor de pincel detecta a entrada pressionada do Touchpad, ele verifica a posição da entrada para determinar se ela foi à esquerda ou à direita.When the brush selector detects touchpad's pressed input, it checks the position of the input to determine if it was to the left or right.

Espessura do traço com selectPressedAmountStroke thickness with selectPressedAmount

Em vez do evento InteractionSourcePressType. Select no InteractionSourcePressed () , você pode obter o valor analógico do valor pressionado por meio de selectPressedAmount.Instead of the InteractionSourcePressType.Select event in the InteractionSourcePressed(), you can get the analog value of the pressed amount through selectPressedAmount. Esse valor pode ser recuperado em InteractionSourceUpdated () .This value can be retrieved in InteractionSourceUpdated().

private void InteractionSourceUpdated(InteractionSourceUpdatedEventArgs obj)
{
    if (obj.state.source.handedness == handedness)
    {
        if (obj.state.touchpadPressed)
        {
            // Check which side we clicked
            if (obj.state.touchpadPosition.x < 0)
            {
                currentAction = SwipeEnum.Left;
            }
            else
            {
                currentAction = SwipeEnum.Right;
            }

            // Ping the touchpad material so it gets bright
            touchpadTouchTime = Time.unscaledTime;
        }

        if (activeBrush != null)
        {
            // If the pressed amount is greater than our threshold, draw
            if (obj.state.selectPressedAmount >= selectPressedDrawThreshold)
            {
                activeBrush.Draw = true;
                activeBrush.Width = ProcessSelectPressedAmount(obj.state.selectPressedAmount);
            }
            else
            {
                // Otherwise, stop drawing
                activeBrush.Draw = false;
                selectPressedSmooth = 0f;
            }
        }
    }
}

Script de borrachaEraser script

Borracha é um tipo especial de pincel que substitui a função DrawOverTime () do pincelde base.Eraser is a special type of brush that overrides the base Brush's DrawOverTime() function. Embora Draw seja true, o apagador verifica se a sua gorjeta está interseccionada com qualquer traçado de pincel existente.While Draw is true, the eraser checks to see if its tip intersects with any existing brush strokes. Em caso afirmativo, eles são adicionados a uma fila para serem reduzidos e excluídos.If it does, they are added to a queue to be shrunk down and deleted.

Design avançado – portabilidade e LocomotionAdvanced design - Teleportation and locomotion

Se você quiser permitir que o usuário se mova pela cena com a Teleportation usando Thumbstick, use MixedRealityCameraParent em vez de MixedRealityCamera.If you want to allow the user to move around the scene with teleportation using thumbstick, use MixedRealityCameraParent instead of MixedRealityCamera. Você também precisa adicionar InputManager e DefaultCursor.You also need to add InputManager and DefaultCursor. Como o MixedRealityCameraParent já inclui MotionControllers e limite como componentes filho, você deve remover o MotionControllers existente e o ambiente pré-fabricado.Since MixedRealityCameraParent already includes MotionControllers and Boundary as child components, you should remove existing MotionControllers and Environment prefab.

InstruçõesInstructions

  • No painel hierarquia , exclua MixedRealityCamera, Environment e MotionControllersIn the Hierarchy panel, delete MixedRealityCamera, Environment and MotionControllers

  • No painel Projeto, pesquise e arraste o seguinte pré-fabricados para o painel hierarquia :From the Project panel, search and drag the following prefabs into the Hierarchy panel:

    • Assets/AppPrefabs/Input/pré-fabricados/MixedRealityCameraParentAssets/AppPrefabs/Input/Prefabs/MixedRealityCameraParent
    • Assets/AppPrefabs/Input/pré-fabricados/InputManagerAssets/AppPrefabs/Input/Prefabs/InputManager
    • Ativos/AppPrefabs/entrada/pré-fabricados/cursor/DefaultCursorAssets/AppPrefabs/Input/Prefabs/Cursor/DefaultCursor

    Pai da câmera de realidade misturada

  • No painel hierarquia , clique em Gerenciador de entradaIn the Hierarchy panel, click Input Manager

  • No painel Inspetor , role para baixo até a seção simples do seletor de ponteiro únicoIn the Inspector panel, scroll down to the Simple Single Pointer Selector section

  • No painel hierarquia , arraste DefaultCursor para o campo cursorFrom the Hierarchy panel, drag DefaultCursor into Cursor field

    Atribuindo DefaultCursor

  • Salve a cena e clique no botão reproduzir .Save the scene and click the play button. Você poderá usar o Thumbstick para girar para a esquerda/direita ou teleport.You will be able to use the thumbstick to rotate left/right or teleport.

FimThe end

E esse é o fim deste tutorial!And that's the end of this tutorial! Você aprendeu:You learned:

  • Como trabalhar com modelos de controlador de movimento no modo de jogo e no tempo de execução do Unity.How to work with motion controller models in Unity's game mode and runtime.
  • Como usar diferentes tipos de eventos de botão e seus aplicativos.How to use different types of button events and their applications.
  • Como sobrepor elementos de interface do usuário na parte superior do controlador ou personalizá-lo totalmente.How to overlay UI elements on top of the controller or fully customize it.

Agora você está pronto para começar a criar sua própria experiência de imersão com os controladores de movimento!You are now ready to start creating your own immersive experience with motion controllers!

Cenas concluídasCompleted scenes

  • No painel de projeto do Unity, clique na pasta cenas .In Unity's Project panel click on the Scenes folder.
  • Você encontrará duas cenas de Unity MixedReality213 e MixedReality213Advanced.You will find two Unity scenes MixedReality213 and MixedReality213Advanced.
    • MixedReality213: cena concluída com pincel únicoMixedReality213: Completed scene with single brush
    • MixedReality213Advanced: cena concluída com vários Brushes com o exemplo de valor de pressionar do botão SelecionarMixedReality213Advanced: Completed scene with multiple brush with select button's press amount example

Consulte tambémSee also