Se connecter

Informatique

Création de Jeux

Sujet : J'aide les gens dans Unreal Engine
Metallicar8
Niveau 40
03 août 2019 à 22:54:46

Bonsoir !

J'ai encore un soucis. Dans mon projet j'en suis actuellement au niveau des options et de la gestion des sauvegardes. Mais la sauvegarde ne prend pas en compte tous les changements qu'il y a eut au cours de la partie.

C'est un exemple un peu particulier donc difficile d'être concis. Pour le moment, il s'agit d'un élément précis. Un static mesh détruit qui repop.

À un certain stade, après un event précis, le jeu créer une sauvegarde, puis renvoi le joueur au menu de jeu (un menu interactif, un peu à la super mario 3 dans les différents monde). L'event enregistre dans le BP du joueur et donc dans le game instance, l'avancée du joueur dans le jeu, ce qu'il a accompli. Cet event précis déclenche dans un même temps la destruction d'un static mesh présent sur le menu interactif, qui ouvre un passage pour la suite du jeu. Tout fonctionne correctement. Le static mesh disparaît, et lorsque je quitte un niveau pour revenir, il a bien disparu.

Mais lorsque je quitte le jeu et que je recharge la partie, que je reviens dans le menu interactif, le mesh a repop. Or, d'après mes print string installés à chaque bout de node :sournois: le jeu a bien chargé la partie sauvegardée avec l'avancée du joueur enregistré (il me faudrait faire un widget qui m'affiche à l'écran la fonction en question pour en être totalement sûr mais je fais confiance à mes print string).

Donc je sais pas d'où ça peut venir. Mesh ? Game Instance ? Une erreur dans le code ? Les trois ? :peur:

Pour réaliser cela je me suis appuyé d'un toto en français qui permettait de sauvegarder la vie et l'exp depuis un bouton de sauvegarde. Moi je voulais sauvegarder le fait que le joueur a accompli les 20 niveaux du jeux et que ça sauvegarde automatiquement à la fin du 20ème. Tout semble fonctionner, sauf quand je recharge la partie.
Merci :ok:

Alex3112
Niveau 24
03 août 2019 à 23:24:26

C'est pas très clair alors je réponds peut etre à côté .
Le game instance n'est pas un fichier de sauvegarde. C'est une classe qui n'est pas détruite au changement de map mais les variables ne sont pas stockées sur le disque dur. Du coup si tu quitte et que tu relance le jeu, elle est créée avec les valeurs par défaut.
Il faut que tu crée un blueprint de classe "Save game" dans lequel tu crée les variables qui seront sauvegardées dans le fichier de sauvegarde et que tu crée une fonction de sauvegarde et une fonction de chargement quelque part (généralement dans le game instance justement)

https://docs.unrealengine.com/en-US/Gameplay/SaveGame/Blueprints/index.html

Metallicar8
Niveau 40
04 août 2019 à 01:27:37

J'ai oublié de mentionner que j'ai bien mi les variables dans un bp "Save Game" :hap: La variable pour le mesh du joueur et pour ses accomplissements dans la partie, sous forme de boolean. Je précise que j'ai juste entrée les deux variables. Il n'y a pas de nodes, de fonctiones, c'est vide.

Donc j'ai ma fonction "save game" que j'ai mise dans le bp du joueur. Je trouvais ça plus propre. J'ai juste à appeler la fonction quand je veux. Donc j'ai bien le fichier "Game" qui apparaît dans mes fichiers du jeu lorsque ça sauvegarde.

https://www.noelshack.com/2019-31-7-1564873930-savegame.png

Du coup, à la fin du dernier level accompli via une collision box, j'appelle la fonction "save game" puis je renvois le joueur dans le "menu play".

Et quand le "menu play" s'ouvre, ça vérifie si le dernier level a été accompli (ici "building levels". Si oui, ça déclenche la destruction du static mesh "arbre pawn". Jusque là ça fonctionne, hormis le fait que je sois obligé de faire le cast to game instance à la place du caste to player pour que ça fonctionne. Ce qui n'est pas normal.

https://www.noelshack.com/2019-31-7-1564874080-arbredetruit.png

Lorsque le menu principale s'ouvre j'appelle la fonction qui charge la partie sauvegardée, nommée "Game".

Idem pour la fonction qui charge la partie sauvegardée:
https://www.noelshack.com/2019-31-7-1564873812-chargegame.png

Les print string s'affiche, mais c'est que du vent. Puisque le static mesh détruit revient et mon changement de mesh reset ou me fige avec le mesh sauvegardé.

J'ai un peu l'impression de retrouver le problème que j'avais avant avec mon changement de static mesh, mais à une autre échelle, celle de la sauvegarde. J'ose même pas imaginer la sauvegarde d'un RPG. Là j'ai juste deux pauv' variables moisies... :noel:

Metallicar8
Niveau 40
04 août 2019 à 01:31:17

Si je comprends bien le lien que t'as posté, ça sauvegarde l'entièreté du game instance pour le renvoyer au chargement de la partie ?
Si oui, c'est un gain de temps considérable. :noel:
Je testerai ça demain.

Metallicar8
Niveau 40
04 août 2019 à 10:22:02

https://www.noelshack.com/2019-31-7-1564905083-game-instance.png

Du coup j'ai développé ça dans le game instance. J'ai séparé les deux node en fonction, une pour sauvegarder et l'autre pour charger le jeu. Puis j'appelle la fonction save game instance lorsque je le veux, puis j'appelle la fonction load game à l'event begin play du menu principale. Ça me créait bien un fichier sauvegarde, mais ça résout pas mon problème.

En dehors du mesh du joueur et du static mesh en question qui doit être détruit, je n'ai pas d'autre élément de game play qui me permet de savoir si le chargement du jeu a bien eu lieu.

Alex3112
Niveau 24
04 août 2019 à 14:38:43

Bah un fichier de sauvegarde, ce n'est que des variables. Si tu n'en as que deux dans ton "game save" et qu'elles sont correctement chargées, c'est que c'est bon. Après c'est compliqué de debugger un code dont on connait pas la structure/logique juste en voyant des bouts de code.

Metallicar8
Niveau 40
05 août 2019 à 14:30:07

Lorsque je fais une sauvegarde via la fonction "save game" du pawn et que je charge le jeu via la fonction "load game" du pawn, ma vie est bien remise au niveau qu'elle avait lors de la sauvegarde. Mais lorsque je charge un niveau, ça me reset la vie au max. Pourtant, lorsque je suis en jeu avec un certain nombre de vies, elle ne se reset pas entre chaque niveau grace au game instance. Pour ce qui est des variables "mesh" du pawn et de la variable en boolean, la sauvegarde ne les prend pas en compte, pourtant le game instance les enregistre en temps réel en jeu.

Pour ce qui est de faire une fonction save et load game directement depuis le game instance (comme dans le lien ci-dessus), aussi via le "save game", la fonction enregistre bien la partie mais est incapable de la charger correctement car aucune des trois variables citées plus haut n'est chargé à son état précédent. La fonction "load game" est bien lue puisque le print string de fin répond.

Alex3112
Niveau 24
05 août 2019 à 14:59:52

Comme je disais, là on est plus dans un problème de connaissance. Debugger un code sans avoir tout le projet sous la main, c'est compliqué, ça tient plus de la divination. Plus le projet grossi et moins c'est possible.

Metallicar8
Niveau 40
05 août 2019 à 15:37:49

Oui je me doute, du coup je me débrouille comme je peux.

Et bien voilà ! Je viens de contourner le problème tout bêtement. À la fin de la fonction "load game", pour chaque variable sauvegardées, j'appelle juste la fonction de ces variables (qui permet ensuite de réenregistrer les variables sauvegardées dans le game instance). :sournois:

Metallicar8
Niveau 40
07 août 2019 à 11:50:11

C'est encore moi. :rouge:
Est-ce que vous connaissez un moyen d'appliquer dès le lancement du jeu les paramètres sauvegardés ?

La plupart des tutos ne montre pas comment charger en jeu les paramètres sauvegardés. Ça fait deux jours que j'applique divers tuto.

J'ai tenté quelque chose via le game instance, mais je n'arrive pas à renvoyer les valeur au chargement à cause de l'impossibilité de faire un cast to ui widget.

Et l'Event Construct de l'event graph de mon widget settings me permet de charger la sauvegarde des paramètres que lorsque le menu de ce widget est ouvert. Graphismes, Full screen, resolution, tout s'applique correctement. Autant dire que c'est inutile. :hap:

Metallicar8
Niveau 40
07 août 2019 à 13:37:43

Je parviens toutefois à contourner le problème, de manière sale, en faisant un "create widget" der l'UI Settings au lancement du menu principale, avec un add to viewport en hidden + remove all widget. Comme ça ça appelle directement le widget en question sans le montrer à l'écran afin de l'appliquer. Mais c'est une manière crade :hap:

Alex3112
Niveau 24
07 août 2019 à 14:54:48

La plupart des tutos ne montre pas comment charger en jeu les paramètres sauvegardés

C'est marqué ici, "load game from slot" :
https://docs.unrealengine.com/en-US/Gameplay/SaveGame/Blueprints/index.html

Et l'Event Construct de l'event graph de mon widget settings me permet de charger la sauvegarde des paramètres que lorsque le menu de ce widget est ouvert.

Là c'est un problème d'organistation. Les fonctions de sauvegarde/chargement doivent se trouver dans le game instance, avec toutes les variables persistantes.
Un widget ne doit servir que d'interface pour communiquer avec les classes qui contiennent du code

anomage
Niveau 16
07 août 2019 à 15:24:24

Hello :)

J'essaie en ce moment de faire un jeu de cartes. Tout est prêt au niveau de la gestion des cartes : deck, ce qui se passe à chaque tour.
Par contre, j'arriver pas à contrôler les joueurs... J'ai créé un blueprint Pawn, les deux joueurs arrivent (sachant qu'à terme ça se joue à 4), mais je ne sais vraiment pas comment les contrôler, d'où les contrôler, comment les différencier... Impossible déjà de déplacer les pawns, de façon à ce qu'ils voient le plateau de jeu sur lequel les cartes sont posées :-(

Je ne comprends rien au mode Turn Based du online, mais j'ai l'impression que ça ne me servira pas

Si vous avez une réponse à toutes ces questions ça serait super, même si je suis convaincu que toutes mes questions découlent d'un seul point noir que j'ai concernant le moteur :(

Merci ! :)

(Désolé j'en ai créé un topic j'avais oublié celui-ci)

Metallicar8
Niveau 40
07 août 2019 à 17:00:59

Le 07 août 2019 à 14:54:48 Alex3112 a écrit :

La plupart des tutos ne montre pas comment charger en jeu les paramètres sauvegardés

C'est marqué ici, "load game from slot" :
https://docs.unrealengine.com/en-US/Gameplay/SaveGame/Blueprints/index.html

Et l'Event Construct de l'event graph de mon widget settings me permet de charger la sauvegarde des paramètres que lorsque le menu de ce widget est ouvert.

Là c'est un problème d'organistation. Les fonctions de sauvegarde/chargement doivent se trouver dans le game instance, avec toutes les variables persistantes.
Un widget ne doit servir que d'interface pour communiquer avec les classes qui contiennent du code

Décidément, je suis vraiment une quille avec le game instance...

Après le "load game from slote" qui retourne les valeurs, ici, du "cast to mysavegame", il faut faire quoi ? Sauf erreur de ma part, après le "save game instance" il faut faire un "set *variable*" du joueur et faire un "get *variable*" du "mysavegame". Sans ça il n'y a aucune cible pour recevoir les variables sauvegardées et les appliquer en jeu. C'est du moins ce que j'ai fait pour mon player (cast to) et ça fonctionne très bien. Sans ça je ne sais pas comment le faire fonctionner.

Alors j'ai essayé de reproduire la même chose avec le widget. Mais il est impossible de faire un cast to. Du coup, lors du "load game frome slote", j'ignore comment recevoir les variables sauvegardées dans le "save settings". La fonction s'arrête au "set settings" du "cast to save settings" et, évidemment, les paramètres sauvegardées ne se chargent au lancement du jeu.

S'il n'y a pas besoin de faire un cast to c'est que j'ai strictement rien compris au game instance.

J'ai également reproduit ça, mais je ne comprends pas la dernière étape avec le cast to game instance. https://answers.unrealengine.com/questions/757917/proper-way-to-save-various-game-settings.html

Pour mon projet, il s'agit clairement de l'étape la plus difficile. Ça va faire plus d'une semaine que je suis sur les sauvegardes alors que le prototype je l'ai bâclé en deux jours à peine. :hap:

Alex3112
Niveau 24
07 août 2019 à 22:01:05

Sauf erreur de ma part, après le "save game instance" il faut faire un "set *variable*" du joueur et faire un "get *variable*" du "mysavegame".

C'est bien ça. Ta fonction de sauvegarde prend toutes les variables du "game instance" et les enregistre dans le "game save" et ta fonction de chargement fait l'inverse.

Alors j'ai essayé de reproduire la même chose avec le widget

Ca je comprends pas. Qu'est-ce que tu cherche à faire avec ce widget, à quoi sert-il?
Parce que là tu me décris un code que tu as imaginé, avec des noms de fonction et d'event que tu as imaginé donc c'est un peu abstrait.
Plutôt que de parler de code, explique ce que tu cherche à faire et je retraduirais en code

Metallicar8
Niveau 40
08 août 2019 à 00:16:56

Je vais faire ça étape par étape:

1)Le jeu se lance et le joueur apparaît sur le menu principal.
2)On va sur option et le widget settings s'affiche à l'écran. On choisit les paramètres (Graphics, Fullscreen ou non, Resolution).
3)On appliques les paramètres grâce au bauton "apply"

On le voit pas sur l'image, mais dans le graphe du widget settings il y a l'event "Apply Settings" qui applique les choix du joueur avec la console de commande. J'ai ensuite essayé de modifier la suite de l'event pour utiliser le GameInstance.
https://www.noelshack.com/2019-32-4-1565215582-apply.png

Ensuite ça sauvegarde. J'ai bien le fichier Settings dans mes fichiers. Après, as-t-il sauvegardé les variable appliquées, je sais pas encore...
https://www.noelshack.com/2019-32-4-1565215734-instancesave.png

Puis on fait l'inverse en chargeant ce qui a été sauvegardé. Cast to save settings, avec la référence set settings, et ensuite ? Il n'y a rien pour reprendre les variables et les appliquer en jeu.
https://www.noelshack.com/2019-32-4-1565215805-instanceload.png

Ceci se trouve dans l'event graphe du GameInstance afin d'activer la fonction load dès le lancement du jeu.
https://www.noelshack.com/2019-32-4-1565215972-instancegraphe.png

À ce stade, si j'utilise le game instance, j'ai une sauvegarde dans mes fichiers. Et c'est tout.

Et au départ, tout cas je l'avais fait dans le graphe du widget en suivant les différents tuto youtube. Ça fonctionne mais faut retourner dans les menu pour que ça se charge, donc c'est inutile. :rire:

Alex3112
Niveau 24
08 août 2019 à 00:36:55

Le projet est gros? Tu peux le compresser et m'envoyer le lien par mp? Parce que là honnêtement sans pouvoir naviguer entre les blueprint pour comprendre la structure du code, c'est difficile de comprendre.
Au pire s'il y a des assets volumineux, enlèves les , c'est pas gênant pour lire le code.

Metallicar8
Niveau 40
08 août 2019 à 00:49:53

Non c'est un puzzle game, il n'est pas gros pour le moment, et il ne le sera pas. 470 Mo dans mes fichiers.
Mais je sais pas comment le compresser et te l'envoyer.

Metallicar8
Niveau 40
08 août 2019 à 00:55:33

On voit ça demain :ok:

Metallicar8
Niveau 40
08 août 2019 à 12:12:27

Du coup j'ignore quoi copier, compresser, envoyer. :(

Sujet : J'aide les gens dans Unreal Engine
   Retour haut de page
Consulter la version web de cette page