Eventos de proximidade

Detete quando um player entra ou sai da proximidade de uma Entity.

As interações de proximidade permitem que entities reajam a eventos de botão quando um player entra, está perto e, de forma aproximada, está a encará-la, sem exigir que aponte o cursor para a entity.

Os eventos de ponteiro tradicionais usam ray-casting: o player precisa apontar o cursor para o collider de uma entity antes de poder pressionar um botão para disparar o evento. Os eventos de proximidade, por outro lado, verificam entities que estão dentro de uma determinada área ao redor do avatar, independentemente de para onde o cursor do player esteja apontando.

A área interativa considerada para interações de proximidade é uma larga fatia triangular de uma esfera, projetando-se para a frente a partir da posição do player. Ao contrário dos eventos de ponteiro, a direção para a qual o avatar está virado é importante, independentemente da direção para a qual a câmera está virada.

Para definir uma custom logic mais específica, talvez você queira lidar com os dados brutos e usar o Advanced abordagem.

Para que uma entity seja interativa, ela deve ter um collider. Veja obstacles para mais detalhes.

Registrar callbacks de proximidade

O pointerEventsSystem inclui funções auxiliares para eventos de proximidade, seguindo o mesmo padrão que callbacks de eventos de ponteiro.

Pressões de botão de proximidade

Use pointerEventsSystem.onProximityDown para detetar pressões de botão enquanto o player está dentro do alcance. Ao contrário de onPointerDown, isto não exige que o player aponte o cursor para a entity.

pointerEventsSystem.onProximityDown(
    {
        entity: myEntity,
        opts: {
            button: InputAction.IA_PRIMARY,
            hoverText: 'Press E',
            maxPlayerDistance: 5,
        },
    },
    function () {
        console.log('Player pressed button near entity')
    }
)

Use pointerEventsSystem.onProximityUp para detetar quando o player solta um botão enquanto está dentro do alcance.

Tipos de eventos de proximidade

Foram adicionados dois novos valores ao PointerEventType enum:

  • PET_PROXIMITY_ENTER: Disparado quando o player entra no alcance de proximidade da entity.

  • PET_PROXIMITY_LEAVE: Disparado quando o player sai do alcance de proximidade da entity.

Estes podem ser usados com um PointerEvents component e a inputSystem para as abordagem baseada em system. Essa abordagem também suporta pressões de botão de proximidade usando o InteractionType.IT_PROXIMITY campo.

Prioridade

Quando várias entities estão dentro do alcance e podem responder à mesma entrada, apenas uma é ativada, por padrão a mais próxima. Use o prioridade campo para controlar qual tem precedência. Entities com um número maior como valor de prioridade respondem primeiro.

Se o player estiver ao mesmo tempo dentro do alcance de uma entity com interação de proximidade e o cursor do player estiver apontando para uma entity que tem uma interação de ponteiro, a entity com a interação de ponteiro recebe sempre prioridade. Novamente, apenas uma entity é ativada.

No exemplo acima, se ambas as entities estiverem dentro do alcance, a entity da porta responde porque tem a prioridade mais alta.

O prioridade campo também pode ser definido nas propriedades de um PointerEvents component.

Opções

As funções auxiliares de proximidade aceitam as mesmas opções que as suas equivalentes de ponteiro:

  • button: Qual botão ouvir. Veja Pointer buttons para opções suportadas.

  • maxDistance: Distância máxima desde o camera do player até à entity, em metros.

  • maxPlayerDistance: Distância máxima desde o avatar até à entity, em metros. Esta é a definição mais relevante para eventos de proximidade.

  • hoverText: Texto a exibir na UI quando o player está perto da entity.

  • showHighlight: Se verdadeiro, mostra um destaque na borda da entity quando o player está dentro do alcance. true por padrão.

  • showFeedback: Se verdadeiro, mostra feedback de hover, pairando à volta do centro da entity. true por padrão.

  • prioridade: Resolve conflitos quando várias entities estão em proximidade. Valores mais altos têm precedência. Se várias entities tiverem o mesmo valor de prioridade, é escolhida a mais próxima.

Remover callbacks

Para remover um callback de proximidade, use a função de remoção correspondente:

Depois de removida, a entity deixa de reagir a esse evento de proximidade.

Entrada e saída de proximidade

Use pointerEventsSystem.onProximityEnter para executar um callback quando o player entra no alcance de proximidade da entity, e pointerEventsSystem.onProximityLeave quando sai. Isto pode ser usado para mostrar dicas de feedback extra ao player, por exemplo um som ou uma animação quando um item pode ser interagido.

Exemplo: porta por proximidade

O exemplo seguinte abre ou fecha uma porta quando o player pressiona um botão enquanto está perto, sem precisar apontar para a porta.

Atualizado