Unreal – Position aléatoire au sommet d’un cube

Pour un prototype, je devais générer des positions aléatoires au dessus d’un terrain plat formé uniquement d’un Cube, pour être exacte un StaticMeshActor de type cube.

Après quelques recherches, je n’ai pas trouvé de solution qui me convenait. La solution la plus propre étant de faire une « zone de spawn » mais dans mon cas où je voudrais faire spawn au dessus de multiple blocs… il ne serait pas très optimisé d’avoir autant de zone.

Je vous propose donc de comprendre comme fonctionne les StaticMeshActor et voir comment on peut générer une position aléatoire dans une zone dynamique.

De quoi parle-t-on ?

StaticMeshActor, quel nom barbare, c’est pourtant les éléments de bases quand on veut placer des éléments.

Que ce soit le cube, sphère, cylindre, cone, … ils héritent tous de l’interface StaticMesh.

D’après la documentation d’unreal l’interface. Il est décrit comme étant un élément géométrique, un polygone. Static dans le sens où il ne sera pas possible de l’animer.

Version simple

Les fonctions qui vont suivre ont en paramètre d’entrée un StaticMeshActor en référence et en sortie un vecteur pour la position aléatoire.

Depuis le StaticMesh, on peut récupérer la zone à partir des bords. Pour faire simple on récupère une zone définie par le volume.

Pour comprendre comment lire le Box Extend et l’Origin.
L’origin étant assez simple à comprendre, c’est le centre de notre objet.
L’extend est la taille de l’objet, il est lié au scale à la dimension, mais au lieu du ratio c’est la dimension finale.

Avec des valeurs, l’origine est en plein centre, soit (0, 0, 0) et l’extend est de (1500, 1500, 50)

Cette solution est sympa, mais elle propose une position à l’intérieur du pavé… pas très pratique !

Solution avancée

Avec un peu de travail sur les deux vecteurs peuvent être retravaillés.
On cherche à avoir une position sur le dessus de notre objet. Le plus simple étant de supposer que notre zone à une épaisseur de 0 et que l’origine est au sommet de l’objet.

Ainsi on peut faire notre addition sur la position et spécifier le 0 de l’épaisseur sur l’axe Z.

En bonus, on peut aussi empêcher d’avoir des positions trop proche des bords. La valeur de 10 est totalement arbitraire et dépends de ce que vous voulez faire spawn.

Astuce

Pour les tests, vous avez pu voir que ma fonction demande en paramètre le StaticMesh en entrée.
Pour simplifier les tests, afin de récupérer facilement l’élément concerné ayant été posé sur le level, j’utilise les tags pour le distinguer des autres.

Depuis l’éditeur, dans les paramètres du sol, dans mon cas le cube, il suffit d’ajouter le tag qu’on souhaite (si possible unique)

Où on veut dans le code, on peut donc récupérer les différents éléments présents. Dans mon cas j’utilise ce bout de code dans Event BeginPlay du GameMode.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.