4
votes

Meilleur moyen d'implémenter un système de grille hexadécimal / isométrique 2D dans Unity (pour les tuiles complexes)?

J'essaye de créer un système de grille pour un jeu 2D. Je ne sais pas vraiment si j'irai avec une grille hexagonale ou isométrique, mais ce qui ne devrait pas trop compter ici. Fondamentalement, j'essaie de créer un jeu de tower defense dans lequel vous déployez des unités au lieu de tours et pouvez les déplacer comme si vous jouiez à un jeu tactique. Le problème est que les tuiles elles-mêmes vont être complexes - il y aura différents types de terrain. Certaines unités ne peuvent être déployées qu'en X, et ne peuvent pas passer par Y, ce genre de chose. J'ai également besoin de la possibilité d'ajouter de la logique à ces tuiles à volonté - qui sait, peut-être que je veux une tuile spéciale pour donner une portée d'attaque supplémentaire aux unités au-dessus, ce genre de chose. Le jeu doit également «se sentir» comme une grille - faire claquer les choses au centre des tuiles, ainsi que mettre en évidence les tuiles en vol stationnaire et lors du déplacement / attaque.

Exemple isométrique Exemple de grille hexagonale

D'accord, cela m'amène à une voie assez évidente: je peux créer des préfabriqués pour les différents types de tuiles dont j'ai besoin, ajouter toutes les propriétés et la logique en tant que composants de script et créer une classe de grille qui instancie chaque tuile dans le monde. Cela fonctionne très bien, car de cette façon j'ai un contrôle total sur tout - je peux faire ce que je veux avec les tuiles, et je peux également créer une matrice 2D pour leurs positions lorsque je les instancie. De cette façon, je peux appeler tile [3, 6] par exemple, ce qui semble être une grosse affaire pour le cheminement, la mise en évidence, etc. Je peux aussi lier n'importe quel gameobject qui se trouve dessus à la tuile elle-même, donc je pourrais appeler quelque chose comme tile [6, 2] .ObjectOnTop. ~ WhateverInfoINeedFromIt, ce qui semble également très pratique pour la logique globale.

Mais les lacunes sont également terribles - comment concevoir et déployer des conceptions de niveaux différents? La seule façon dont je peux y penser est de trouver un moyen de tout faire à la main, d'exporter ces informations d'une manière ou d'une autre dans un fichier json et de faire en sorte que la classe de grille qui instancie tout sélectionne quelle tuile sera instanciée en fonction des informations json. . Non seulement je n'ai aucune idée de la façon de mettre en œuvre cela, mais je pense aussi que ce serait une quantité de travail absurde pour quelque chose qui est censé être naturel. Je ne sais pas non plus si un gameobject pour chaque tuile est une bonne idée en termes de performances. Le plus gros problème? Il est facile de créer une telle grille s'il s'agit d'une simple grille de carreaux carrés - mais lorsque nous commençons à parler d'hexagones et de grilles isométriques ... ce n'est pas aussi facile, honnêtement. Les formes complexes rendent si difficile de travailler avec ce genre de chose. Par exemple, comment puis-je même convertir la position de la souris en une tuile équivalente? C'est super facile pour les carrés ... pas tellement pour le reste. C'est aussi un peu dommage que la grille ne soit vraiment déployée que lorsque le jeu tourne (est-ce généralement considéré comme une mauvaise chose que je devrais éviter, au fait?).

Mais ne vous inquiétez pas, car j'ai trouvé la solution: les tilemaps! Bien sûr! Cela résout tous les problèmes que j'ai, non? Soi-disant oui, mais cela supprime également toute la puissance que j'avais d'avoir des préfabriqués. Maintenant, je ne peux pas avoir de logique avec les tuiles ... Ils ne peuvent stocker aucune propriété ... donc je suis condamné, je suppose. J'ai lu un peu sur les moyens de surmonter cela (pinceaux préfabriqués, classes personnalisées inhérentes à Tile, création d'un tilemap pour chaque type de tuile), mais ils sont honnêtement extrêmement niches et ne se sentent tout simplement pas bien.

C'est tellement étrange, un système de grille générique comme celui-ci était censé être si simple et commun. Mais je ne trouve pratiquement aucune information. C'est comme si je manquais cet outil assez évident que personne ne semble mentionner car c'est aussi évident. Alors me voilà, j'ai du mal à démarrer un projet car je n'arrive même pas à comprendre comment implémenter la structure de base du jeu. Tout ce que je vois en ligne me conduit à des tilemaps - mais ils ne fonctionnent que pour des éléments très basiques, d'après ce que j'ai compris. Je ne travaillerai pas pour ce genre de jeu, je pense. Je ne sais pas quoi faire à ce stade - il doit y avoir un moyen optimal de tout résoudre, celui qui est probablement utilisé pour tous les développeurs qui travaillent sur ce genre de jeu. Et honnêtement, il y en a une tonne.

Alors, s'il vous plaît, faites-moi la lumière. Et merci beaucoup d'avance!

(Voici quelqu'un qui a posté une question extrêmement similaire: Par Tilemap Tile Data Storage & Retrieval )


0 commentaires

3 Réponses :


0
votes

convertir la position de la souris en position de tuile peut être fait de différentes manières, le plus simple serait de lancer la souris et de voir si elle touche une tuile

probablement plus facile de créer un tableau 2dimensionnel de tuiles de la classe 'Tile', même si son hexadécimal le décompose en un tableau 2d et un décalage, configurez les tuiles dynamiquement dans le code

pour le chemin et un tel algorithme djikstra est assez utile

https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm


0 commentaires

0
votes

J'ai exactement le même problème. Le meilleur que j'ai trouvé est celui-ci: https://m.youtube.com/playlist?list=PLzDRvYVwl53uhO8yhqxcyjDImRjO9W722

C'est une playlist de CodeMonkey où il crée grille par script mais aussi en ajoutant des génériques, qui vous permettent d'avoir cette logique que vous voulez et d'ajouter des tuiles visuelles. Le seul problème est que, même si je veux des carrés, vous voulez des formes différentes. Je ne sais pas comment faire cela, peut-être que vous pouvez ajuster la grille (plus probablement le tilemap qu'il utilise pour afficher les visuels) ou peut-être que vous devriez simplement abandonner différentes formes, je ne sais pas.

J'espère que j'ai aidé au moins peu. J'ai vu ce post et c'est très triste que personne ne vous ait répondu. J'espère que vous pourrez réaliser ce que vous voulez et que ce sera un succès. Bonne chance et surtout amusez-vous :)


1 commentaires

Bienvenue à SO. Il est bon de publier ici les parties de code essentielles des didacticiels externes (car souvent les liens ne sont plus disponibles plus tard)



0
votes

Peut-être que ça peut aider

grid = new gridSpace[roomWidth + 3, (roomWidth / 2) + 2];
int xStep = 4; # 2:1 isometry type
    for (int x = 0; x < roomWidth - 1; x += xStep) #xStep depends by type of isometry
    {
        int minX = x;
        int maxX = x + 2;

        int localX = x;
        for (int y = roomWidth / 2; y > -1; y--)
        {
            grid[localX, y] = gridSpace.empty;
            if (localX == minX)
            {
                localX = maxX;
            }
            else
            {
                localX = minX;
            }

        }
    }


0 commentaires