Utilisez GUI.Box()
.
Si vous n'avez besoin que d'un rectangle 2D, l'interface graphique est la voie à suivre. Créez un nouveau GUIStyle en utilisant un simple rectangle comme texture (l'intérieur du rectangle doit être transparent, bien sûr), définissez sa Border
valeur pour qu'il ne soit pas étiré et appelez GUI.Box(new Rect(...),"",myGuiStyle);
.
Vous pouvez utiliser la Camera.WorldToScreenPoint
méthode si vous souhaitez définir quelque chose en coordonnées universelles (c'est-à-dire en 3D), rappelez-vous simplement que dans les coordonnées universelles d'Unity, y va de bas en haut et dans l'interface graphique, y va de haut en bas.
Exemple de code:
void OnGUI()
{
//top left point of rectangle
Vector3 boxPosHiLeftWorld = new Vector3(0.5f, 12, 0);
//bottom right point of rectangle
Vector3 boxPosLowRightWorld = new Vector3(1.5f, 0, 0);
Vector3 boxPosHiLeftCamera = Camera.main.WorldToScreenPoint(boxPosHiLeftWorld);
Vector3 boxPosLowRightCamera = Camera.main.WorldToScreenPoint(boxPosLowRightWorld);
float width = boxPosHiLeftCamera.x - boxPosLowRightCamera.x;
float height = boxPosHiLeftCamera.y - boxPosLowRightCamera.y;
GUI.Box(new Rect(boxPosHiLeftCamera.x, Screen.Height - boxPosHiLeftCamera.y, width, height),"", highlightBox);
}
Ça ne fait rien
la source
Vous trouverez ci-dessous une approche sans shader.
Considérez votre boîte 2D comme rien de plus que quatre lignes, où chaque ligne est étirée dans une seule dimension (les deux autres dimensions sont la coupe transversale du bord). C'est un peu comme si vous construisiez une boîte dans la vie réelle, où vous assemblez des longueurs de bois variables qui ont toutes la même taille de section transversale.
Dans cet esprit, vous pouvez concevoir un composant, par exemple
BoxBuilder
, qui lorsqu'il est attaché à un GameObject, crée et gère quatre GameObjects enfants. Chaque objet de jeu enfant est l'un des bords de votre boîte et peut simplement être un cube 3D étiré dans une seule dimension. Avec unwidth
etheight
définiBoxBuilder
niveau, vous pouvez calculer le positionnement nécessaire et à l' échelle non uniforme des quatre bords de l' enfant. Ce sera beaucoup depos.x=w/2
,pos.y=h/2
, ...,scale.x=h
,scale.y=w
, etc. sorte de code.Bien que je pense que vous ne demandiez que le 2D, notez que cette même idée peut être appliquée aux boîtes 3D si nécessaire, où le
BoxBuilder
maintenant doit créer et gérer 12 bords enfants, mais encore une fois, mettre à l'échelle chaque bord dans une dimension locale.la source
Un moyen simple consiste à utiliser un shader avec deux passes: la première passe utilise le vertex shader pour redimensionner un peu l'objet et utilise le pixel shader pour le colorer en une couleur unie correspondant à la couleur souhaitée pour le contour, et puis le deuxième Pass fait le rendu régulier.
la source
J'ai eu ce même problème lors de la création d'un contour, sauf que j'avais besoin de créer le "trait" pour un cube 3D, et j'ai trouvé une nouvelle façon de le faire que je n'ai vu nulle part ailleurs en ligne.
Dans l'image ci-dessous, il y a deux formes avec des contours. Celui de droite est un cube construit avec LineRenderer, qui crée des faces planes qui se tournent toujours vers l'utilisateur. J'ai trouvé cette méthode super glitchy, avec des "coups" aléatoires qui imitaient les triangles qui composent le visage.
Celui de gauche est mon «innovation» avec 12 cubes maigres séparés construisant ce qui ressemble à un contour. Pour modifier la taille du «trait» dans le contour, je dois augmenter / diminuer la taille des deux côtés de chacun des 12 cubes maigres. Cela fonctionnerait également pour les contours 2D. Il suffit d'appliquer un matériau pour changer la couleur et le tour est joué!
Dans cette image, vous pouvez voir un détail de la structure de ce cube. Tout cela pourrait être créé au moment de l'exécution, mais je l'ai fait à la main et l'ai utilisé comme préfabriqué.
la source
Je suis actuellement confronté au même problème, et ma solution est exactement ce que DuckMaestro et Raven Dreamer ont suggéré - Avoir un script qui crée 4 objets enfants au moment de l'exécution, chacun représentant un côté de la bordure et attacher des rendus de ligne à chacun.
Dans mon cas, je devais constamment redimensionner la bordure pour la garder autour de mon objet (un maillage de texte [qui utilise un rendu de maillage] pour un champ de texte personnalisé), donc à chaque mise à jour, je faisais ceci:
AlterBorder()
accède simplement au rendu de ligne approprié (spécifié par le premier paramètre) et définit respectivement son début et sa fin sur le premier et le deuxième vecteur.Notez que j'ai utilisé
renderer
comme référence pour la taille, mais vous pouvez évidemment utiliser n'importe quel rectangle, tant que x, y est le coin supérieur gauche.D'après ce que je peux dire, cela fonctionne très bien, a fière allure dans le jeu car je peux facilement déplacer mon objet bordé dans les 3 axes (même le faire pivoter, et puisque les rendus de ligne font toujours face à la caméra, cela n'a pas l'air bizarre), et est pas difficile à mettre en œuvre.
la source