Je crée un jeu en utilisant une carte de tuiles composée de plusieurs milliers de carrés de grille. À l'heure actuelle, chaque carré a un collisionneur carré pour vérifier les collisions.
Cependant, avec plusieurs milliers de minuscules blocs, il est inefficace de les vérifier tous pour détecter les collisions. Si j'avais su que le tilemap allait ressembler à ceci à l'avance, j'aurais pu utiliser 3 ou 4 gros collisionneurs plutôt que des milliers de minuscules:
Existe-t-il une sorte d'algorithme standard pour combiner de nombreuses petites tuiles adjacentes en de grandes tailles maximales? Dans l'affirmative, quelqu'un pourrait-il le décrire ici, ou pointer vers la littérature sur de tels algorithmes?
Alternativement, peut-être que prétraiter les collisionneurs de tuiles de cette manière est complètement la mauvaise approche. Dans l'affirmative, quelle est la bonne solution pour gérer l'efficacité d'un très grand nombre de collisionneurs?
la source
Réponses:
J'ai trouvé cet algorithme utile pour le moteur love2d ( langue lua )
https://love2d.org/wiki/TileMerging
Voici l'exemple de love2d sur mon projet actuel. En rouge, vous pouvez voir mes collisionneurs de murs.
la source
Si vous cherchez à créer un terrain destructible, la façon dont je l'ai fait dans Unity, c'est de placer les collisionneurs uniquement sur les blocs de bord de votre monde. Ainsi, par exemple, voici ce que vous aimeriez accomplir:
Tous ces blocs verts contiennent un collisionneur, et les autres non. Cela économise une tonne de calculs. Si vous détruisez un bloc, vous pouvez activer les collisionneurs sur les blocs adjacents assez facilement. Gardez à l'esprit que l'activation / la désactivation d'un collisionneur est coûteuse et doit être effectuée avec parcimonie.
Ainsi, la ressource Tile ressemble à ceci:
C'est un objet de jeu standard, mais il peut également être mis en commun. Notez également que le collisionneur de boîtes est désactivé par défaut. Nous ne l'activerions que s'il s'agit d'une tuile de bord.
Si vous chargez statiquement votre monde, il n'est pas nécessaire de regrouper vos tuiles. Vous pouvez simplement les charger en une seule fois, calculer leur distance par rapport au bord et appliquer un collisionneur si nécessaire.
Si vous chargez dynamiquement, il est préférable d'utiliser un pool de tuiles. Voici un exemple édité de ma boucle de rafraîchissement. Il charge les tuiles en fonction de la vue actuelle de la caméra:
Idéalement, j'écrirais un article beaucoup plus détaillé, car il se passe beaucoup plus de choses en coulisses. Cependant, cela peut vous aider. S'il y a des questions, n'hésitez pas à me contacter ou à me contacter.
la source