Como adicionar quase interatividade

As interações próximas surgem na forma de toques e apreensões. Os eventos de toque e captura são levantados como eventos de pointer pelo PokePointer e SpherePointer,respectivamente.

São necessários três passos-chave para ouvir eventos de toque e/ou agarrar eventos de entrada num determinado GameObject.

  1. Certifique-se de que o ponteiro relevante está registado no perfil de configuração mrtkprincipal.
  2. Certifique-se de que o GameObject desejado tem o componente de script de agarrar ou tocar apropriado e .
  3. Implemente uma interface de manipulador de entrada num script anexado ao GameObject desejado para ouvir os eventos de agarrar ou tocar.

Adicione interações de grab

  1. Certifique-se de que um SpherePointer está registado no perfil de ponteiro MRTK.

    O perfil MRTK predefinido e o perfil padrão HoloLens 2 já contêm um SpherePointer. Pode-se confirmar que um SpherePointer será criado selecionando o perfil de configuração mrtk e navegando paraopções de ponteiro de pontosde entrada. O GrabPointer pré-fabricado prefácio predefinido (Ativos/MRTK/SDK/Features/UX/Prefabs/Pointers) deve ser listado com um GrabPointer de Controlador de Mão Articulada. Um pré-fabricado personalizado pode ser utilizado desde que implemente a SpherePointer classe.

    Grab Pointer Profile Example

    As consultas padrão de ponteiro de agarrar para objetos próximos em um cone em torno do ponto de captura para combinar com a interface padrão Hololens 2.

    Conical Grab Pointer

  2. No GameObject que deve ser grabbable, adicione um NearInteractionGrabbable , assim como um collider.

    Certifique-se de que a camada do GameObject está numa camada agarrada. Por padrão, todas as camadas exceto a Consciência Espacial e os Raios Ignore são grabbable. Veja quais as camadas que são agarraveis inspecionando as máscaras de camada grab no seu pré-fabricado GrabPointer.

  3. No GameObject ou num dos seus ancestrais, adicione um componente de script que implementa a IMixedRealityPointerHandler interface. Qualquer ancestral do objeto com o NearInteractionGrabbable será capaz de receber eventos de ponteiro, também.

Agarre o exemplo do código

Abaixo está um script que vai imprimir se um evento é um toque ou agarrar. Na função de interface IMixedRealityPointerHandler, pode-se olhar para o tipo de ponteiro que desencadeia esse evento através do . Se o ponteiro for um SpherePointer,a interação é uma apreensão.

public class PrintPointerEvents : MonoBehaviour, IMixedRealityPointerHandler
{
    public void OnPointerDown(MixedRealityPointerEventData eventData)
    {
        if (eventData.Pointer is SpherePointer)
        {
            Debug.Log($"Grab start from {eventData.Pointer.PointerName}");
        }
        if (eventData.Pointer is PokePointer)
        {
            Debug.Log($"Touch start from {eventData.Pointer.PointerName}");
        }
    }

    public void OnPointerClicked(MixedRealityPointerEventData eventData) {}
    public void OnPointerDragged(MixedRealityPointerEventData eventData) {}
    public void OnPointerUp(MixedRealityPointerEventData eventData) {}
}

Adicionar interações de toque

O processo de adicionar interações de toque em elementos UnityUI é diferente do que para os GameObjects 3D de baunilha. Pode saltar para a seguinte secção, Unity UI,para ativar componentes de UI de unidade.

No entanto, para ambos os tipos de elementos UX, certifique-se de que um PokePointer está registado no perfil de ponteiro MRTK.

O perfil MRTK predefinido e o perfil padrão HoloLens 2 já contêm um PokePointer. Pode-se confirmar que um PokePointer será criado selecionando o perfil de configuração mrtk e navegar para opçõesde ponteiro de ponteirode entrada. O PokePointer prefácio (Ativo/MRTK/SDK/Features/UX/Prefabs/Pointers) deve ser listado com um PokePointer de controlador de mão articulada. Um pré-fabricado personalizado pode ser utilizado desde que implemente a PokePointer classe.

Poke Pointer Profile Example

GameObjects 3D

Existem duas maneiras diferentes de adicionar interações de toque a GameObjects 3D, dependendo se o seu objeto 3d deve ter apenas um único plano tocável, ou se deve ser tocável com base em todo o seu collider. A primeira maneira é tipicamente em objetos com BoxColliders, onde é desejado ter apenas uma face do collider reagir a eventos de toque. O outro é para objetos que precisam de ser tocáveis de qualquer direção com base no seu colisor.

Toque de rosto único

Isto é útil para permitir situações em que apenas um rosto precisa de ser tocável. Esta opção pressupõe que o objeto do jogo tem um BoxCollider. é possível usá-lo com objetos não-BoxCollider, caso em que as propriedades 'Bounds' e 'Local Center' muito devem ser definidas manualmente para configurar o plano tocável (ou seja, os limites devem ser definidos para um valor não zero-zero).

  1. No GameObject que deve ser tocável, adicione um BoxCollider e um NearInteractionTouchable componente [ xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable).

    1. Desajuste eventos para receber ao toque se utilizar a interface [ [ [ [xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) no seu script de componente abaixo.

    2. Clique em corrigir limites e corrigir o centro

    NearInteractionTouchable Setup

  2. Nesse objeto ou num dos seus ancestrais, adicione um componente de script que implementa oIMixedRealityTouchHandler interface. Qualquer ancestral do objeto com o [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) também será capaz de receber eventos de ponteiro.

Nota

Na vista da cena do editor com o GameObject NearInteractionTouchable selecionado, note um quadrado e seta de contorno branco. A seta aponta para a "frente" do tocável. O collidável só será tocável a partir dessa direção. Para tornar um colisor tocável de todas as direções, consulte a secção sobre o toque do colisor arbitrário. NearInteractionTouchable Gizmos

Toque de colisor arbitrário

Isto é útil para permitir situações em que o objeto do jogo precisa de ser tocável ao longo de toda a sua face collider. Por exemplo, isto pode ser usado para permitir interações de toque para um objeto com um SphereCollider, onde todo o collider precisa ser tocável.

  1. No GameObject que deve ser tocável, adicione um collider e um NearInteractionTouchableVolume componente [ xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchableVolume).

    1. Desajuste eventos para receber ao toque se utilizar a interface [ [ [ [xref:Microsoft.MixedReality.Toolkit.Input.IMixedRealityTouchHandler) no seu script de componente abaixo.
  2. Nesse objeto ou num dos seus ancestrais, adicione um componente de script que implementa oIMixedRealityTouchHandler interface. Qualquer ancestral do objeto com o [ NearInteractionTouchable ] (xref:Microsoft.MixedReality.Toolkit.Input.NearInteractionTouchable) também será capaz de receber eventos de ponteiro.

UI de unidade

  1. Adicione/garanta que há uma tela UnityUI na cena.

  2. No GameObject que deve ser tocável, adicione um NearInteractionTouchableUnityUI componente.

    1. Desaça eventos para receber ao toque se utilizar a interface no seu script componente abaixo.
  3. Nesse objeto ou num dos seus ancestrais, adicione um componente de script que implementa a IMixedRealityTouchHandler interface. Qualquer ancestral do objeto com o NearInteractionTouchableUnityUI será capaz de receber eventos de ponteiro também.

Importante

Os objetos podem não se comportar como esperado se estiverem localizados em objetos sobrepostos de lona. Para garantir um comportamento consistente, nunca sobreponha objetos de lona na sua cena.

Importante

No NearInteractionTouchable componente script, para a propriedade NearInteractionTouchable duas opções: Ponteiro e Toque. Desa estaladie eventos para receber para ponter se utilizar a interface e definir para Touch se utilizar a interface no seu script componente que responda/manuseie os eventos de entrada.

Exemplo de código de toque

O código abaixo demonstra um MonoBehour que pode ser ligado a um GameObject com um NearInteractionTouchable componente variante e responder a eventos de entrada de toque.

public class TouchEventsExample : MonoBehaviour, IMixedRealityTouchHandler
{
    public void OnTouchStarted(HandTrackingInputEventData eventData)
    {
        string ptrName = eventData.Pointer.PointerName;
        Debug.Log($"Touch started from {ptrName}");
    }
    public void OnTouchCompleted(HandTrackingInputEventData eventData) {}
    public void OnTouchUpdated(HandTrackingInputEventData eventData) { }
}

Exemplos de script de interação próxima

Eventos de toque

Este exemplo cria um cubo, torna-o tocável e muda de cor no toque.

public static void MakeChangeColorOnTouch(GameObject target)
{
    // Add and configure the touchable
    var touchable = target.AddComponent<NearInteractionTouchableVolume>();
    touchable.EventsToReceive = TouchableEventType.Pointer;

    var material = target.GetComponent<Renderer>().material;
    // Change color on pointer down and up
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) => material.color = Color.green);
    pointerHandler.OnPointerUp.AddListener((e) => material.color = Color.magenta);
}

Agarre eventos

O exemplo abaixo mostra como tornar um GameObject arrastado. Assume que o objeto do jogo tem um colisor.

public static void MakeNearDraggable(GameObject target)
{
    // Instantiate and add grabbable
    target.AddComponent<NearInteractionGrabbable>();

    // Add ability to drag by re-parenting to pointer object on pointer down
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = ((SpherePointer)(e.Pointer)).transform;
        }
    });
    pointerHandler.OnPointerUp.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = null;
        }
    });
}

APIs úteis

Ver também