[RESOLU][MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

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
Aelhan
Messages : 21
Inscription : 11 Déc 2019 23:00

[RESOLU][MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Aelhan » 29 Déc 2019 19:00

Bonjour à tous,

Ce n'est pas un réel problème que j'ai, car j'ai trouvé une solution, mais je ne suis pas certain que c'est la meilleure.

Ce qu'il se passe, c'est lors de la création d'un jeu incrémental (clicker, idle toussa toussa), il y a nécessairement un équivalent du "Prestige" (tout recommencer à 0 avec un bonus).

Mais voilà, lorsque je clique sur mon bouton prestige, je réinitialise toutes les valeurs ("argent" détenu, niveau des différents items achetés, production/clic, production/s), et lorsque ma production/s atteint un certain seuil, ma fonction prestige a une inertie, c'est à dire que tout est réinitialisé, mais on commence avec une somme d'argent (proportionnelle à la production/s) alors que le code dit que ça devrait être 0 (et pourtant, je me suis pas mal pris la tête en mettant dans mon code de prestige à plusieurs endroit "argent = 0;").

La seule solution que j'ai trouvé, c'est d'appeler une coroutine après la réinitialisation du reste qui est la suivante :

Code : Tout sélectionner

        IEnumerator reinit()
        {
            yield return new WaitForEndOfFrame();
            argent = 0;
        }
        
En tout cas, comme ça, ça fonctionne, j'en suis très content (surtout d'y avoir pensé tout seul après 2h de prise de tête !).

Si jamais certains sauraient me dire s'il y a une meilleure solution, j'en serais ravi ! (mais encore plus fier si vous me dites que c'est LA bonne solution ;) )

D'avance, merci de vos retours,
Bon dev !
Dernière édition par Aelhan le 30 Déc 2019 08:24, édité 1 fois.

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

Re: [MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Alesk » 29 Déc 2019 20:22

J'ai pas compris ton histoire de "prestige"... je ne dois pas avoir la ref...

En attendant, si ta valeur "argent" ne reste pas à zéro, c'est qu'il doit il y avoir une autre partie du code qui change aussi sa valeur.

Aelhan
Messages : 21
Inscription : 11 Déc 2019 23:00

Re: [MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Aelhan » 29 Déc 2019 21:43

Il y a de très nombreux jeux qui utilisent ce système, on clique sur un élément, ce qui donne une monnaie qui permet d'améliorer le gain de cette monnaie par clic.
Par la suite on accède à d'autres achats qui alimentent automatiquement cette monnaie, mais dont le prix augmente de manière exponentielle de manière à ce qu'un moment le joueur est "bloqué" pour faire d'autres achats les prix étant prohibitifs.
C'est là qu'intervient le concept de prestige, c'est à dire de réinitialiser tout (argent, achats effectués, tout quoi) mais en contrepartie il y a une monnaie secondaire qui donne un bonus de production (par exemple des billets, dont la quantité obtenue dépend du point auquel on est arrivé, et chaque billet donne par exemple un bonus de 1% de toutes les productions) ce qui permet après le prestige d'aller plus loin dans le jeu, jusqu'à être re bloqué de nouveau avoir recours au prestige.
Et donc dans mon cas, au départ tout va bien, quand je suis à des valeurs de production faible tout se remet correctement à 0. Je n'ai pas le code sous les yeux(je suis à l'apéroavec mon tel :p ), mais ça donne un truc comme ça (au clic sur le bouton prestige) :

Code : Tout sélectionner

Public void Prestige () 
{
Achat1.gainParSeconde = 0;
Achat2.gainParSeconde = 0;
...

Argent = 0;
}
Je réinitialise non seulement .gainParSeconde, .Niveau, .prixAmelioration...
Mais quand je mets tout ça dans une même fonction, sans appeler de coroutine, ça me fait comme si il y avait une sorte d'inertie et il ne me réinitialise que partiellement la variable "argent", comme si la productionParSeconde avait une sorte d'inertie (en fait tout se réinitialise simultanément et ça fait comme si le code avait le temps pendant un bout de frame de remettre un peu de sous dans la cagnotte).

Je ne sais pas si c'est plus clair comme ça, mais hésites pas à me demander si ce n'est pas le cas.

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

Re: [MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Alesk » 29 Déc 2019 21:47

C'est plus clair... mais ça ne m'aide pas à t'aider plus que ça ;)

Là il faudrait voir tout ton code pour identifier le souci.

Aelhan
Messages : 21
Inscription : 11 Déc 2019 23:00

Re: [MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Aelhan » 29 Déc 2019 22:25

hum... C'est pas que je veux pas, mais ça représente une petite dizaine de scripts (peut-être pas quand même parce que le cameraBehaviour par exemple ne risque pas d'interférer !)...
Je verrai demain tranquillement pour poster a minima les parties "intéressantes" pour identifier le souci !

Sur ce merci, bonne nuit et à demain !

Aelhan
Messages : 21
Inscription : 11 Déc 2019 23:00

Re: [MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Aelhan » 30 Déc 2019 08:23

Bonjour !

J'ai envie de dire "Grumph", ce matin j'ai créé un nouveau projet avec seulement les scripts et parties incriminantes.
Seulement, voilà, je suis monté rapidement à des nombres prohibitifs (oui, j'ai cheaté et alors ?) et en appliquant le prestige... eh bien aucun souci, ça revient bien à 0 à tous les coups :/
J'imagine que la surcharge du nombre de variables à réinitialiser peut être une cause de mon souci d'inertie ?
En tout cas, pas d'inquiétude, je vais investiguer à l'occasion de mon côté, l'important étant que j'ai trouvé une parade !
Merci quand même d'avoir pris le temps d'essayer de comprendre !
Je passe le sujet en résolu quand même.
Bon dev !

Edit : Je pense avoir finalement trouvé ce qui ne va pas, en fait, dans la fonction update de mon GameManager, j'ai le calcul permanent de "Argent" (argent += gainParSeconde * Time.deltatime;), et donc, lorsque je clique sur "prestige", a priori, il est déjà en train de faire le calcul dans l'update dans la même frame, et du coup, pour que ça fonctionne sans la coroutine, il faudrait que je clique au premier instant de la frame, ce qui me paraît assez compliqué :pasdrole: du coup, ma coroutine qui attend la fin de la frame en cours paraît assez cohérente. Je pense que ça ne l'a pas fait sur mon projet test de ce matin parce qu'il est 100 fois plus léger (et les formules de calcul 100 fois moins recherchées aussi) et donc le temps de calcul est négligeable. En espérant que cela puisse éventuellement servir à d'autres qui se trouveraient face à ce souci !

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

Re: [Résolu][MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Alesk » 30 Déc 2019 09:38

Je doute TRES FORTEMENT que tes formules de calcul du score puissent impacter la vitesse d'exécution du code au point de provoquer ce genre de ralentissement.

Il faudrait repenser ton algorithme de calcul ou bien regarder du côté de l'ordre d'exécution des scripts, pour voir si ça n'aide pas à régler simplement ce problème.
https://docs.unity3d.com/Manual/class-MonoManager.html

Aelhan
Messages : 21
Inscription : 11 Déc 2019 23:00

Re: [RESOLU][MY-AL] Inertie des nombres dans un jeu incrémental lors du prestige

Message par Aelhan » 31 Déc 2019 18:46

Je te remercie, je te confirme que ce ne sont pas mes algorythmes qui font devenir le système insolent, parce que si c'est le cas sur un jeu de clicker, je comprends pas comment on arrive à faire des "vrais" jeux :p
En tout cas ton lien m'a pas mal aidé, j'ignorais l'existence de cette possibilité d'ordonner l'éxécution des scripts, et c'est super à savoir ! (et il y a beaucoup de petites infos super intéressantes dans ce chapitre !)
Mais je te confirme que j'ai tenté plein de choses dans ce goût là depuis que j'ai le lien, que ce soit dans l'ordre d'exécution, de passer mon calcul du prestige en fixed update, celui du gainParSeconde en laetupdate (et l'inverse même si ça n'a aucun sens !) et rien n'y fait j'ai toujours cette fichue inertie.
Je vais rester avec ma coroutine, elle est en plus dans cette page décrite parmi les options qui permettent d'organiser l'ordre d'exécution des fonctions, c'est que ça doit pas être si mal ;)
En tout cas, je me pencherai plus en détail dessus quand j'aurai un peu de temps à perdre, mais y a un moment, faut avancer, surtout quand ça fonctionne bien comme ça !

Sur ce, je souhaite un bon réveillon à tous les utilisateurs du forum !

A l'année prochaine !

Répondre

Revenir vers « (C#) CSharp »