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:
float width = Mathf.Max(renderer.bounds.size.x + paddingX * 2, minWidth);
float x = renderer.bounds.center.x - width / 2;
float height = renderer.bounds.size.y + paddingY * 2;
float y = renderer.bounds.center.y - height / 2;
AlterBorder(0, new Vector3(x - thickness / 2, y, 0), new Vector3(x + width + thickness / 2, y, 0)); //Bottom edge going left to right
AlterBorder(1, new Vector3(x + width, y + thickness / 2, 0), new Vector3(x + width, y + height - thickness / 2, 0)); //Right edge going bottom to top
AlterBorder(2, new Vector3(x + width + thickness / 2, y + height, 0), new Vector3(x - thickness / 2, y + height, 0)); //Top edge going right to left
AlterBorder(3, new Vector3(x, y + height - thickness / 2, 0), new Vector3(x, y + thickness / 2, 0)); //Left edge going top to bottom
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.