Génération de niveau aléatoire / procédurale vs génération précédente

31

Quels sont les avantages / inconvénients de l'utilisation de la génération aléatoire / procédurale par rapport aux niveaux prédéfinis?

Il semble y avoir peu de choses auxquelles je peux penser, à part le fait que les éléments peuvent être un problème à distribuer sur un terrain généré de manière aléatoire, et que le terrain généré peut sembler étrange.

L'inconvénient des niveaux précédemment créés est que je devrais cependant créer un éditeur de niveau. Je ne peux pas décider ce qu'il vaut mieux utiliser.

Les réponses pourraient-elles inclure du code / des exemples de génération procédurale et prédéfinie, ainsi que les avantages / inconvénients?

Pépin
la source

Réponses:

26

Pour répondre brièvement à votre question principale, les principaux avantages d'un monde de jeu généré de manière procédurale sont les suivants:

  • Le monde peut être immense , beaucoup plus grand que n'importe quel monde de jeu conçu manuellement.

  • Le monde (ou au moins des parties de celui-ci) peut être régénéré pour chaque jeu, augmentant potentiellement la valeur de rejeu, car le joueur aura toujours quelque chose de nouveau à découvrir.

Inversement, les principaux inconvénients de la génération procédurale sont les suivants:

  • Selon les méthodes de génération utilisées, il peut être difficile de s'assurer que le monde est toujours jouable, c'est-à-dire que le joueur ne peut pas rester bloqué sans aucun moyen de procéder simplement parce qu'il est malchanceux avec la génération mondiale.

  • Même si vous pouvez éviter de générer des mondes complètement illisibles, la génération aléatoire de mondes peut conduire à un niveau de difficulté très variable: parfois, le joueur peut trouver tout ce dont il a besoin juste aligné pour la prise, parfois il peut durer longtemps sans trouver quoi que ce soit d'utile .

    Sur de longues périodes, de telles fluctuations aléatoires ont tendance à se résumer en moyenne, mais si la difficulté du jeu est par exemple fortement chargée (typique pour les jeux de survie), un mauvais départ pourrait ruiner un jeu tandis qu'un départ très chanceux pourrait le priver de tout défi.

  • Une génération procédurale mal faite peut rendre le monde monotone et ennuyeux: après avoir vu une douzaine de labyrinthes générés au hasard, ils commencent tous à se ressembler, même s'ils diffèrent dans les détails.

  • De plus, si le monde du jeu est complètement régénéré pour chaque jeu, il n'y aura pas de lieux fixes ou de fonctionnalités que le joueur pourrait reconnaître à partir des jeux précédents. Un tel manque de familiarité pourrait rendre plus difficile pour le joueur de s'engager avec le jeu sur le plan émotionnel ou de partager des expériences avec d'autres joueurs.

Il y a aussi une chose que vous pouvez compter dans l'une ou l'autre liste: dans un jeu où le monde est régénéré de manière aléatoire pour chaque jeu, il ne peut pas y avoir de guide de «visite virtuelle», car chaque jeu sera différent.

(Cette non-répétabilité pourrait également être un problème pour les tests et le débogage, bien qu'elle puisse être au moins partiellement évitée en permettant de spécifier la graine RNG, au moins en mode débogage, et / ou en fournissant une commande "cheat" qui peut être utilisée pour avance rapide à différentes étapes.)


Cependant, si vous regardez la liste des inconvénients, vous verrez qu'elle décrit principalement les inconvénients de la génération procédurale pure ; beaucoup d'entre eux peuvent être évités en mélangeant du contenu généré manuellement et procéduralement .

Par exemple, le joueur peut toujours commencer dans une ville fixe, conçue manuellement, peut-être entourée d'une région d'origine plus ou moins fixe, mais des endroits plus éloignés de la ville peuvent être générés de manière aléatoire pour toujours fournir des régions inconnues au joueur.

Il pourrait également y avoir d'autres villes conçues manuellement ou d'autres endroits placés (plus ou moins) au hasard dans le monde, de telle sorte que le joueur devra les trouver, mais saura à quoi s'attendre une fois qu'il y sera. Inversement, des éléments saillants tels que des montagnes pourraient être placés manuellement (au moins à proximité de l'emplacement de départ fixe), mais les détails de leur terrain pourraient être randomisés.

En ce qui concerne le placement aléatoire provoquant des blocages et des variations de difficulté, cela peut être résolu en implémentant diverses vérifications de cohérence et d'équilibre en plus de votre algorithme de génération de monde procédural. Par exemple, si le joueur a besoin d'un élément particulier pour pouvoir traverser l'eau, vous pouvez inclure un code garantissant qu'au moins un tel élément est placé de sorte que le joueur puisse l'atteindre sans traverser l'eau.

De même, vous pouvez également modifier vos règles de placement des objets afin qu'aucune baguette de génialité ne soit placée avant que le joueur n'atteigne le niveau x , et peut-être pour s'assurer qu'au moins une est placée dans un endroit fixe où le joueur peut atteindre avant d'arriver au stade où ils en auront besoin pour survivre.


Soit dit en passant, une façon courante de rendre le contenu procédural et généré manuellement plus ou moins transparente est de démarrer le processus de génération manuelle en utilisant le générateur de monde procédural (peut-être adapté de manière appropriée, par exemple pour générer un village ou un sommet de montagne où vous le souhaitez). ) pour initialiser la région que vous concevez, puis l'ajuster manuellement pour ajouter et ajuster les détails souhaités. (Cela peut également permettre un stockage de niveau très compact, en enregistrant uniquement les modifications manuelles et la valeur de départ du générateur et les paramètres utilisés.)

D'autres façons de combiner le contenu manuel et procédural incluent de laisser des espaces vides dans vos niveaux conçus manuellement, à remplir par du contenu aléatoire (par exemple, un château pourrait inclure un labyrinthe généré aléatoirement dans les donjons, avec seulement le contour et les sorties fixes), ou la conception manuelle pourrait spécifier uniquement les grandes lignes de certaines parties du niveau (par exemple l'emplacement des maisons dans une ville) et laisser les détails (tels que l'apparence exacte de chaque maison) être choisis au hasard.

En fait, même de nombreux jeux dont le monde du jeu est entièrement fixe utilisent une certaine forme de génération procédurale dans le cadre de leur processus de conception de niveaux, car il existe certains aspects de la génération du monde (comme la production d'un terrain d'apparence naturelle ou le placement d'arbres individuels dans une forêt). qui sont difficiles et / ou fastidieux à faire à la main, mais relativement faciles à automatiser.

À l'inverse, la plupart des générateurs de monde procédural utiliseront au moins certains objets et éléments conçus manuellement pour construire le monde à partir de. On pourrait même facilement avoir plusieurs niveaux de génération aléatoire / manuelle imbriquée: par exemple, un monde généré par procédure pourrait inclure une ville générée manuellement entourée de bois générés par procédure avec un contour dessiné manuellement, avec des arbres générés par procédure portant des feuilles conçues manuellement.


Notez également que la génération de contenu procédural n'est pas nécessairement incompatible avec un monde fixe: vous pouvez simplement choisir une graine RNG fixe et l'utiliser pour générer votre monde. Cela peut être utile si vous voulez explorer un monde immense pour les joueurs, mais que vous voulez qu'il reste le même pour chaque jeu et pour chaque joueur.

Notez que si vous faites cela (ou peut-être même si vous ne le faites pas), vous devez vraiment concevoir votre générateur de monde pour qu'il fonctionne de manière hiérarchique, en utilisant plusieurs instances RNG, de sorte que, par exemple, le générateur de carte global conserve une seule instance RNG qu'il utiliserait pour générer des sous-régions, en attribuant à chaque sous-région une valeur d'amorçage différente que le générateur de région utiliserait ensuite pour amorcer une instance RNG distincte qu'il utiliserait pour générer la région, etc. C'est pour éviter "l'effet papillon", où le fait de changer même le moindre détail de la plus petite partie de la carte pourrait désynchroniser le RNG et faire en sorte que tout le reste du monde soit complètement différent.

Un autre moyen important d'éviter l'effet papillon, en particulier si vous générez le monde "à la volée" pendant que le joueur l'explore, est d'éviter complètement les RNG normaux (sauf pour les processus qui se produisent "instantanément" du point de vue du joueur, comme générer un nouveau niveau lorsque le joueur y entre) et utiliser à la place des méthodes de génération de nombres aléatoires qui ne stockent aucun état interne. Par exemple, lors du choix de la graine pour une sous-région que le joueur est sur le point d'entrer, le générateur de monde global pourrait prendre les coordonnées de la sous-région (et sa propre graine globale) et les alimenter à une fonction de hachage pour générer la graine de la sous-région. De cette façon, chaque région sera toujours la même, quel que soit l'ordre dans lequel le joueur y entre.


Ps. Après toute cette digression, permettez-moi de répondre brièvement à votre dernière question sur le code réel utilisé pour la génération procédurale. Hélas, je ne pense pas que ce soit vraiment responsable dans un sens, sans beaucoup plus de détails que vous n'en avez fournis, car il existe littéralement autant de façons différentes de générer un monde procédural que de jeux les utilisant.

Par exemple, l'arrière-grand-papa de tous les jeux d'exploration générés de manière procédurale est probablement Rogue , dont l'algorithme de génération de niveau consistait simplement à placer au hasard un tas de pièces rectangulaires dans un niveau rectangulaire plus grand, et à relier ces pièces à des passages (et à placer un escalier pour le niveau suivant dans l'un d'eux). Ses divers successeurs , de Nethack à la série Diablo , ont élaboré ce système de nombreuses manières, mais la plupart ont conservé l'idée de base de niveaux distincts constitués de salles, de donjons et de labyrinthes placés plus ou moins au hasard sur une carte quadrillée.

À l'inverse, pour les jeux proposant des paramètres extérieurs ouverts, vous voudrez probablement commencer par une sorte d' algorithme de génération de terrain fractal et construire d'autres fonctionnalités (rivières, forêts, villes, etc.) en plus de cela. Ou vous pourriez faire quelque chose comme ce que fait Minecraft , et générer une texture procédurale 3D aléatoire déterminant respectivement les parties de votre paysage qui sont au sol et à l'air (mises à l'échelle et biaisées de sorte que les blocs inférieurs sont plus susceptibles d'être meulés), puis superposez des fonctionnalités comme l'eau , sol / roche, végétation, etc. au-dessus.

Bien sûr, rien de ce qui précède ne s'applique si vous écrivez, par exemple, un jeu d' exploration spatiale , auquel cas vous aurez juste besoin de générer un tas de systèmes stellaires placés au hasard selon une fonction de densité, puis de générer un aléatoire ensemble d'étoiles et de planètes dans chacun d'eux. Ou peut-être que vous incitez vos joueurs à explorer un paysage non euclidien , auquel cas vous serez confronté à un ensemble de défis complètement différents (tels que le fait que le volume dans un rayon donné augmente de façon exponentielle plutôt que polynomiale, ce qui en fait vraiment difficile de garder une grande carte en mémoire).

Ilmari Karonen
la source
7

Avantages de la génération procédurale

  1. Peut facilement mettre à l'échelle vos cartes / conceptions à des tailles vraiment grandes, beaucoup plus grandes que vous ne pourriez créer à la main.

  2. En créant un système où des morceaux de terrain sont créés à la volée, vous pouvez éviter d'avoir à écrire des morceaux de code à charger en morceaux à partir de la mémoire permanente.

  3. À long terme, vous pourrez découvrir des niveaux plus viables en utilisant la conception procédurale qu'avec l'édition manuelle de cartes.

  4. Pour votre jeu «explorateur», vous pouvez générer plusieurs dizaines, centaines ou même milliers de niveaux différents les uns des autres, ce qui empêche le joueur de s'ennuyer.

Inconvénients de la génération procédurale

  1. Nécessite beaucoup de travail pour s'assurer que le terrain généré ressemble à ce que vous voulez.

  2. La création de «niveaux de test» devient un problème.

  3. Le placement des objets et autres choses, comme vous l'avez mentionné, doit être fait avec soin, bien que pour un jeu d'exploration de haut en bas, ce serait probablement moins un problème que vous ne le pensez.

  4. À moins que des tests approfondis ne soient effectués, vous pouvez obtenir un scénario dans lequel votre gameplay rompt complètement avec un niveau de procédure particulier, plus encore que si vous avez créé un niveau à la main.

  5. Pour les terrains vraiment complexes, vous pourriez finir par consacrer plus de temps à la correction des bogues et au travail de conception que vous auriez passé à créer un outil de conception de carte de base et un chargeur de fichiers.

Avantages de la conception manuelle

  1. Le game designer peut être plus assuré que le gameplay fonctionne comme il se doit dans le contexte de chaque niveau.

  2. Il est possible de créer et de placer des «détails fins» plus facilement que vous ne le pouvez avec la génération procédurale.

  3. Certaines caractéristiques du terrain sont très difficiles à produire de manière procédurale, comme l'eau qui coule le long d'une montagne. Cela nécessiterait une évaluation très approfondie d'une carte d'élévation qui peut être difficile à concevoir.

  4. Il est plus facile de guider le joueur sur un «chemin linéaire», mais comme vous dites que vous construisez un jeu «explorateur», cela peut ne pas être aussi pertinent.

Inconvénients de la conception manuelle

  1. L'application de modifications étendues à votre terrain prendra du temps, tandis qu'avec la génération procédurale, la simple modification de quelques valeurs donnera un terrain complètement différent.

  2. Vous devrez stocker chaque carte en mémoire, ce qui pourrait être acceptable pour les petits niveaux, mais pour les niveaux plus importants, la génération procédurale pourrait être votre seule option. Augmente les exigences d'installation de mémoire permanente de votre jeu.

  3. Peut nécessiter la construction d'un éditeur de cartes et d'un système de chargement de fichiers.

J'ai fini par énumérer plus d'inconvénients pour la génération de contenu procédural, bien que ce soit probablement parce que mon projet est entièrement procédural, donc je connais ses pièges. Pour un jeu d'explorateur, je vous conseillerais de considérer la taille que vous souhaitez que chaque carte soit et si vous souhaitez faire des outils d'édition de carte distincts.

parar
la source
pouvez-vous (pas ici, mais quelque part) afficher le code de votre génération procédurale? Je ne l'utiliserai pas, mais je n'ai jamais essayé de générer mes cartes de manière procédurale auparavant. (C'est pourquoi j'ai posé cette question: P), Aussi, j'ai voté pour votre réponse, mais je veux en quelque sorte l'opinion des autres, donc je ne peux pas l'accepter tout de suite
Pip