Estou tentando destacar um retângulo de altura arbitrária. Eu pensei que a maneira mais fácil de fazer isso seria criar um objeto de jogo "caixa" separado que contorne o retângulo.
Eu tentei com um MeshRenderer + Transparent Texture e um LineRenderer para delinear os quatro pontos do retângulo. Nem são muito satisfatórios.
(Renderizador de linha ativado no meio, cubo dimensionado à direita)
Qual é o caminho certo para fazer isso? Estou tentando obter algo como o retângulo esquerdo - um perímetro simples de largura fixa através de quatro pontos de minha escolha.
Abaixo está uma abordagem sem sombreador.
Pense na sua caixa 2D como nada mais que quatro linhas, onde cada linha é esticada em apenas uma dimensão (as outras duas dimensões são a seção transversal da aresta). É como se você construísse uma caixa na vida real, onde você está juntando comprimentos variáveis de madeira com todos o mesmo tamanho de seção transversal.
Com isso em mente, você pode criar um Componente, digamos
BoxBuilder
, que quando anexado a um GameObject, cria e gerencia quatro GameObjects filhos. Cada objeto de jogo filho é uma das arestas da sua caixa e pode ser simplesmente um cubo 3D que é estendido em apenas uma dimensão. Com umwidth
eheight
definidoBoxBuilder
nível, você pode calcular o posicionamento necessário e escala não uniforme das quatro bordas da criança. Vai ser um monte depos.x=w/2
,pos.y=h/2
, ...,scale.x=h
,scale.y=w
, etc. tipo de código.Embora eu acredite que você esteja solicitando apenas 2-d, observe que essa mesma idéia pode ser aplicada às caixas 3D, se necessário, onde o
BoxBuilder
agora deve criar e gerenciar 12 arestas filho, mas novamente dimensionar cada aresta em uma dimensão local.fonte
Uma maneira simples é usar um sombreador com duas passagens: a primeira passagem usa o sombreador de vértice para dimensionar um pouco o objeto e usa o sombreador de pixel para colori-lo com uma cor sólida correspondente à cor que você deseja que o contorno tenha; e então o segundo passe faz a renderização regular.
fonte
Eu tive o mesmo problema ao criar um esboço, exceto que precisava criar o "traçado" para um cubo 3D e encontrei uma nova maneira de fazer isso que nunca vi em nenhum outro lugar online.
Na imagem abaixo, existem duas formas com contornos. O da direita é um cubo construído com o LineRenderer, que cria faces planas que sempre se voltam para o usuário. Achei esse método super glitchy, com "golpes" aleatórios aparecendo que imitavam os triângulos que compõem o rosto.
O da esquerda é a minha "inovação", com 12 cubos finos separados, construindo o que parece um contorno. Para alterar o tamanho do “traçado” no contorno, preciso aumentar / diminuir os tamanhos de dois lados de cada um dos 12 cubos finos. Isso também funcionaria para contornos 2D. Basta aplicar um material para mudar a cor e pronto!
Nesta imagem, você pode ver um detalhe da estrutura deste cubo. Tudo isso poderia ser criado em tempo de execução, mas eu o fiz manualmente e o usei como pré-fabricado.
fonte
Atualmente, estou enfrentando o mesmo problema, e minha solução é exatamente o que DuckMaestro e Raven Dreamer sugeriram - Tenha um script que crie 4 objetos filhos em tempo de execução, cada um representando um lado da borda e anexando renderizadores de linha a cada um.
No meu caso, eu precisava redimensionar constantemente a borda para mantê-la em volta do meu objeto (uma malha de texto [que usa um renderizador de malha] para um campo de texto personalizado), para cada atualização que eu fazia isso:
AlterBorder()
simplesmente acessa o renderizador de linha apropriado (especificado pelo primeiro parâmetro) e define seu início e fim para o primeiro e o segundo vetor, respectivamente.Observe que eu usei
renderer
como minha referência para o tamanho, mas obviamente você pode usar qualquer retângulo, desde que x, y seja o canto superior esquerdo.Pelo que sei, isso funciona muito bem, fica ótimo no jogo porque posso mover meu objeto com bordas facilmente em todos os 3 eixos (até girá-lo e, como os renderizadores de linha sempre encaram a câmera, não parece estranho), e é não é difícil de implementar.
fonte