[RESOLU][MY - AL] Gestion des scénarios de jeu

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

[RESOLU][MY - AL] Gestion des scénarios de jeu

Message par Sebela » 04 Oct 2018 11:45

Bonjour à tous ! :cote:

Je développe actuellement un jeu de type Survival/Die&Retry, dans lequel le personnage est confronté à l'apparition régulière de pièges à esquiver et doit survivre le plus longtemps possible.
J'ai différents types de "pièges", par exemple des turrets qui tirent des balles (avec/sans tir automatique), des spikes qui font mourir au contact, des lasers avec animation...
Tous les pièges héritent de classes plus génériques qui héritent toutes de la classe mère Piege. Cela me permet notamment d'activer facilement tous les pièges en même temps si besoin (ou sadisme :diable: )

Bref, à l'heure actuelle les activations de pièges s'enchaînent avec un mécanisme partiellement aléatoire, mais j'aimerais inclure des "scénarios", comme des boss à franchir. Par exemple à la 30ème seconde, tous les lasers s'activent + une turret qui poursuit le héros.

J'en viens donc au sujet du topic : Quelle serait selon vous la meilleure façon de gérer ce genre de scénario. Il faudrait pouvoir dire, pour un temps donné, lancer une fonction donnée sur une liste de "Piege", voire tous les Piege de type "Laser" par exemple.
J'étais parti sur la piste des UnityEvent mais j'ai l'impression que ce n'est pas la solution la plus adaptée. Qu'en pensez-vous ? :0

J'ai ce genre de fonctions pour gérer l'activation massive :

Code : Tout sélectionner

private IEnumerator ActivateAllOfTypeDelayed(System.Type type, float seconds)
    {
        var objectsToActivate = FindObjectsOfType(type);
        foreach (Objet o in objectsToActivate)
        {
            o.enabled = true;
            o.ChangeActivationState(true, false);
            _remainingPoints -= o.GetPoints();
            yield return new WaitForSeconds(seconds);
        }
    }
Des suggestions ? :mrgreen:

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [MY - AL] Gestion des scénarios de jeu

Message par djulio74 » 04 Oct 2018 14:24

Salut. loin d’être un expert vais tenter d'apporter ma pierre à l'édifice. ;-)
je sais pas ce que t'as déjà pris en compte mais mon idée :

ce genre de jeux est plutôt de plus en plus difficile plus on tien longtemps. Avoir donc une valeur ("piegeToActive") qui augmente avec le temps (linéaire, log ou exp..), ce sera le nombre de pièges à activer.
Au lieu d'activer toute les 30 sec par exemple. avoir une valeur de délai ("wait") en randomRange (genre entre 10 et 45 sec), pour pas pouvoir prédire quand arrivera la vague. Avoir un timer en update.
- des que le timer arrive a la valeur "wait", lancer une fonction qui activerai certains pieges ( "ActivePiege() " ).
- redéfinir "wait" avec le randomRange(10,45).
- remise a zero du timer.
et ainsi de suite. tu peux même diminuer les valeurs du randomRange a chaque fois, que les vague soient de plus en plus rapprochées.

La fonction "ActivePiege() " utilise la variable "piegeToActive" ( augmentant dans le temps) pour activer les pieges, encore avec un RandomRange. genre RandomRange( "piegeToActive" , "piegeToActive" +10), Comme ça les vagues sont quand même dans l'ensemble de plus en plus conséquente, tout en etant aléatoire.

Apres pour les boss, tu pourrait compter le nombre d'execution de "ActivePiege() ", et genre toute les n fois, utiliser RandomRange( "piegeToActive" , "piegeToActive" *3 +10), donc 3 * plus de pieges toutes les n iteration de "ActivePiege() "

Je sais pas vraiment si c'est ce que tu demandais, du coup ça se trouve je suis peut etre partis totalement a coté! :lol:

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [MY - AL] Gestion des scénarios de jeu

Message par Sebela » 04 Oct 2018 14:47

Salut Djulio,

Merci beaucoup pour ta réponse !!

En fait, ce que tu expliques c'est grosso modo ce que je fais actuellement, c'est à dire des pièges sélectionnés aléatoirement qui s'activent à chaque nouvelle "vague" (environ toutes les 5 secondes). La seule différence c'est qu'au lieu d'augmenter le nombre de pièges par vagues, j'attribue un certain nombre de points pour chaque piège selon son niveau de difficulté. Le nombre de points utilisés augmente à chaque niveau.

=> Donc en fait ce que je cherche à gérer c'est justement des scénarios non-aléatoire, dans lesquels je dis à des pièges précis d'effectuer telle action à un moment donné.
Je sais pas si c'est plus clair... En tout cas sympa de voir qu'on est assez en phase sur le spawn des pièges en général ^^

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [MY - AL] Gestion des scénarios de jeu

Message par djulio74 » 04 Oct 2018 15:00

Pas de soucis avec plaisir.

Par contre si tu veux du non-aléatoire, il va falloir prédire chaque boss a l'avance, et toute ses données : moment de déclenchement, quels pièges le compose, les points de chaque pièges etc..
tu veux donc du prédit à l'avance ou c'est toi qui décide quels seront les boss et quand? c'est bien ça?

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [MY - AL] Gestion des scénarios de jeu

Message par Alesk » 04 Oct 2018 15:29

Une simple liste d'actions à effectuer avec un délai associé ne suffirait pas ?

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [MY - AL] Gestion des scénarios de jeu

Message par Sebela » 04 Oct 2018 15:54

@ Djulio, oui c'est bien ça. Je conserve le côté aléatoire, puis à certains paliers (par exemple toutes les 30 secondes), je joue un scénario prédéfini dans lequel j'indique quel piège va se déclencher et de quelle façon.
Ma question était de savoir s'il y avait une bonne façon de gérer ces scénarios.

@Alesk, oui c'est exactement ce genre de solution que je cherche ! Mais j'ai du mal à voir comment créer une "action", c'est-à-dire une fonction à appliquer sur une liste de GameObjects prédéfinis ou sur tous les GameObjects d'un type prédéfini...

Tu ferais comment ? :gene3:
Merci Alesk !

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: [MY - AL] Gestion des scénarios de jeu

Message par Alesk » 04 Oct 2018 16:43

Il faut que tous tes objets héritent d'une classe avec une fonction générique qui servira à passer un ordre.
Il faudrait aussi avoir des liste d'objets pour chaque type possible (un dictionary c'est bien pour ça, la clé étant le type d'objet et la vzleur étant a liste d'objets)

Ensuite pour ton historique d'évènement, tu te créés un struct qui contient :
- le délai d'exécution (float)
- le type d'ordre (enum)
- le type d'objet concerné (enum)

Et tu en fais un liste.

Ensuite dans ta fonction update ou fixedupdate, tu analyses la liste pour voir quel est le prochain évènement à traiter.
Et s'il y en a un à traiter, tu fais une boucle sur tous les objets concernés pour leur envoyer l'ordre.

Note : il vaut mieux éviter d'utiliser les fonctions du genre FindObjectsOfType ou GetComponent durant l'exécution du jeu, elles sont gourmandes en cpu ;)

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [MY - AL] Gestion des scénarios de jeu

Message par djulio74 » 04 Oct 2018 16:46

perso donc si c'est bien du tout prédéfini, je créerai un fichier texte avec toute les données dedans, une ligne par boss, tout les éléments nécessaire pour chacun, puis au lancement je lirais chaque ligne et les stockerais dans un struct[]. Comme ça toutes les 30 sec, tu exécute la même fonction avec les données des struct :
30sec => struct[0] : boss 0
60sec => struct[1] : boss 1
etc...

l'avantage est de pouvoir modifier a volonté tes données hors jeux, même hors unity, et stocker une grande quantité de données sans rajouter autant de ligne de code ( que si tu devais definir chaque boss dans un script). J'ai utilisé ce principe de stockage de données pour une simu de voiture (1 texte pour coefs friction des pneu (150 coef), un texte pour géométrie de la voiture qui est générée au lancement : chaque pivot, élément mécanique, position, hingeJoint, ammortisseur..; etc etc)

faut juste bien structurer le fichier texte.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [MY - AL] Gestion des scénarios de jeu

Message par Sebela » 04 Oct 2018 17:23

Excellent le coup du dictionnaire avec type et liste associée ! J'adore cette soluce :D
En plus j'ai déjà une list<Trap> à dispo, plus qu'à les répartir par Subclass ^^ (en plus comme tu dis ça m'évite de refaire une recherche in game et de bouffer du cpu)

Impec, je vais appliquer cette méthode, je vous tiens au courant. Merci beaucoup !

[EDIT] @ Djulio : Je pensais sérialiser mes variables pour les avoir à dispo dans l'editor, sans forcément toucher à mon code. Mais c'est vrai que l'idée du fichier txt permet d'ajouter des données en dehors de unity, ce qui peut être fort pratique ! Je vais réfléchir à ça :) Merci !

Avatar de l’utilisateur
Sebela
Messages : 141
Inscription : 25 Juin 2014 21:39

Re: [MY - AL] Gestion des scénarios de jeu

Message par Sebela » 05 Oct 2018 23:50

Re-salut !

Bon ben ça marche vraiment bien cette solution, j'ai mes types de pièges à dispo depuis l'éditeur avec une action à jouer associée, c'est top !

Image

Je vais essayer d'intégrer la gestion des pièges unitaires sans que ça soit trop cracra :gene: On verra bien ce que ça donnera, en tout cas je suis assez satisfait du résultat actuel :cote:


Un grand merci pour votre aide :merci:

Répondre

Revenir vers « (C#) CSharp »