Donc, je commence à introduire l'attaque à notre espace 2D RTS (c'est dans Unity, donc il est piloté par composants). Au départ, c'était aussi simple que «ennemi à portée, dégâts infligés». Cependant, il y aura plusieurs "types" d'armes / attaques associées à leur navire ou à leur structure. Ainsi que d'autres facteurs impliqués dans le passé, des dommages bruts tels que le type de dommage, et éventuellement l'inertie à l'avenir.
Souhaitez-vous que chaque type d'unité et de structure possède son propre type d'attaque? Cela signifie que vous créez un script pour chaque unité / structure qui définit son type d'attaque, ses dégâts, ses effets, sa portée, ses particules, ses sprites ... etc. Et attachez-le en tant que composant?
Ou faire un script qui définit un type d'attaque, un script pour le type de projectile associé à cela ... etc Et puis étendre ceux-ci et les modifier pour chaque unité, en attachant chaque script à l'unité / structure.
J'espère que j'ai un certain sens, je réfléchis depuis si longtemps, je ne sais pas si je résous un problème, ou si je invente mes propres problèmes et me creuse dans un trou.
Lorsque vous avez un jeu qui peut avoir une multitude de types d'attaque qui peuvent ou non être limités à une unité / structure spécifique, comment concevez-vous le cadre qui le lie aux unités / structures spécifiques dans un environnement de conception piloté par composants ?
Si ce n'est pas assez clair, faites-le moi savoir.
Edit: Excellentes réponses, merci.
Question élargie:
Les réponses semblent varier de "chaque objet peut avoir son propre script d'attaque" à "Avoir les types d'attaque comme leurs propres scripts et les affecter à chaque objet pour une solution plus réutilisable". Disons que j'ai une attaque "blaster", il tire un projectile rouge à une certaine vitesse. Ses dégâts, sa cadence de tir et la taille du projectile dépendent de l'unité qui le tire. Est-il préférable de simplement créer un script d'attaque pour cette unité, ou d'essayer de modifier une "attaque blaster" pour l'adapter à l'objectif de chaque unité qui souhaite l'utiliser?
la source
Réponses:
Eh bien, honnêtement, je ne suis pas un expert en la matière, mais ... Je pense que cela dépend de la complexité et de la variété que vous pensez que les attaques deviendront. Comme c'est un RTS, je suppose que vous aurez peut-être 10 à 50 unités ou structures différentes avec leurs propres types d'attaque.
Option 1: S'il y a un nombre relativement faible d'unités qui auront des attaques quelque peu similaires, je mettrais tout simplement dans un gros script et définirais les paramètres utilisés dans l'inspecteur.
Option 2: Si, au contraire, vous envisagez un grand nombre de types d'attaque avec un comportement différent, vous pouvez tout casser de sorte que chaque unité et bâtiment obtienne leur propre script d'attaque unique. Je pense que si vous faites cela, vous voudrez peut-être créer un script "d'aide" qui définit des morceaux de code couramment utilisés que la plupart des scripts individuels peuvent récupérer. De cette façon, vous n'aurez pas à tout réécrire et vous saurez où tout se trouve.
Option 3: Ce que vous ne devriez probablement pas faire, c'est que certains groupes d'unités partagent des scripts, cela vous confondra probablement et deviendra un gâchis si le code dont vous avez besoin pour une attaque est dans 10 scripts différents.
Ici, je vous ai dessiné une photo.
la source
"Here, I drew you a picture."
m'a rappelé ceJe ne sais pas grand-chose sur Unity et je n'ai pas fait de développement de jeux depuis un moment, alors permettez-moi de vous donner une réponse de programmation générale à cette question. J'ai basé ma réponse sur les connaissances que j'ai sur les systèmes à composants d'entité en général, où une entité est un nombre associé à N nombreux composants, un composant ne contient que des données et un système fonctionne sur des ensembles de composants associés à la même entité.
Votre espace de problème est le suivant:
Je structurerais la solution comme suit:
Il est important que le point de contact entre les attaques et les entités soit aussi fin que possible - cela gardera votre code réutilisable et vous évitera de devoir créer un code en double pour chaque type différent d'entité qui utilise le même type d'attaque . En d'autres termes, voici un pseudo-code JavaScript pour vous donner une idée.
Désolé, cette réponse est un peu «aqueuse». Je n'ai qu'une pause déjeuner d'une demi-heure et il est difficile de trouver quelque chose sans bien connaître Unity :(
la source
Quand une unité / structure / arme attaque, je créerais probablement une attaque (sous-classée avec tous vos détails amusants) qui prend l'attaquant et le défenseur (ou les défenseurs). L'attaque peut alors interagir avec la cible / le défenseur (lent, poison, dégâts, changement d'état), se dessiner (faisceau, rayon, balle) et se débarrasser d'elle-même quand c'est fait. Je peux prévoir certains problèmes comme plusieurs attaques empoisonnées, alors peut-être que vos cibles implémenteraient une interface endommageable avec laquelle l'attaque interagit, mais je pense que c'est une approche pratique modulaire et flexible à changer.
Réponse élargie
Voici comment j'aborderais l'attaque blaster avec cette approche . Je laisserai les autres répondre d'eux-mêmes.
Je voudrais que mes unités implémentent une interface ou une classe IAttacker avec des statistiques / méthodes d'attaque de base. Lorsqu'un IAttacker attaque un IDamageable, il crée son Attack spécifique se passant lui-même et sa cible (l'IAttacker et l'IDamageable, ou peut-être une collection d'IDamageables). L'attaque saisit les statistiques dont elle a besoin de l'IAttacker (pour éviter les changements pendant les mises à niveau ou quelque chose comme ça - nous ne voulons pas que l'attaque modifie ses statistiques après qu'elle ait déjà été lancée) et si elle a besoin de statistiques spécialisées, jette l'IAttacker vers son type nécessaire (ex. IBlasterAttacker) et obtient les statistiques spécialisées de cette façon.
En suivant cette approche, un BlasterAttacker a juste besoin de créer un BlasterAttack, et BlasterAttack s'occupe du reste. Vous pouvez sous-classer BlasterAttack ou créer des FastBlasterAttacker, MegaBlasterAttacker, SniperBlasterAttacker, etc. séparés et le code d'attaque pour chacun est le même (et peut-être hérité de BlasterAttack): créez le BlasterAttack et passez moi-même et mes cibles dans. BlasterAttack gère les détails. .
la source