Unity: desenhar setas com Gizmos - Unity3D - Artigos - Articles - Fórum

Jump to content

Bem vindo à Unidev
Registre para ter acesso a todos os recursos do site. Uma vez registrado e logado, você poderá criar tópicos, postar em tópicos já existentes, gerenciar seu perfil e muito mais. Se você já tem uma conta, faça login aqui - ou então crie aqui uma conta agora mesmo!
- - - - -
Photo

Unity: desenhar setas com Gizmos


A Unity oferece uma gama imensa de opções para desenho de primitivas em modo design que ajudam muito o desenvolvedor a encontrar facilmente informações que auxiliam na criação de uma fase, na identificação de que recursos estão alocados em um Game Object (como por exemplo lâmpadas, audio listeners, etc...)

Porém algumas coisas básicas não são oferecidas pela Unity e ai realmente é que entra a sua criatividade para criar mecanimos que consigam dar uma resposta rápida (e visual) para coisas simples.

No exemplo a seguir eu precisava em tempo real saber se todas as árvores de uma fase apontam para o caminho à frente delas. Claro que selecionando cada Game Object eu saberia onde está o ângulo frontal, mas isso demanda um trabalho chato e exaustivo de ficar selecionando cada objeto.


Posted Image

A solução para o dilema foi usar Gizmos para desenhar as setas a partir de seu próprio ângulo frontal. De uma forma simples, eu agora consigo saber se as árvores apontam para o caminho à sua frente.

Como isso foi feito, basicamente eu dividi em duas partes:
- uma função genérica para desenhar as setas (já que posso precisar usar esse raciocinio em outros objetos)
    public static void DesenharSeta(Vector3 posicao, Vector3 direcao, float distancia = 0.25f, float angulo = 45f)
    {
        Gizmos.DrawRay(posicao, direcao);
        Vector3 esquerda = Quaternion.LookRotation(direcao) * Quaternion.Euler(0f, 180f - angulo, 0f) * new Vector3(0f, 0f, 1f);
        Vector3 direita = Quaternion.LookRotation(direcao) * Quaternion.Euler(0f, 180f + angulo, 0f) * new Vector3(0f, 0f, 1f);
        Gizmos.DrawRay(posicao + direcao, direita * distancia);
        Gizmos.DrawRay(posicao + direcao, esquerda * distancia);
    }
- a chamada propriamente dita no evento OnDrawGizmos do componente anexado ao Game Object.
    void OnDrawGizmos()
    {
        Gizmos.color = Color.white;
        Funcoes.DesenharSeta(gameObject.transform.position + new Vector3(0f, 0.5f, 0f), gameObject.transform.forward, 0.5f);
    }

Nota importante: como você percebe, eu uso uma classe estática para armazenar os métodos comuns, e chamar a função, claro que você pode trazer o código para o DrawGizmos do componente isoladamente mas por boa prática, tudo que você reusa coloque em classes estáticas.
  • Maloke and eulerlobo like this



0 Comments