checkpoint playerpref

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
jones
Messages : 7
Inscription : 29 Jan 2021 11:01

checkpoint playerpref

Message par jones » 29 Jan 2021 11:39

bonjour, est ce que quelqu'un pourrait m'aider sur un problème sur lequel je bloque depuis quelques jours et j'ai rien trouvé sur le net.

alors voilà, je m'entraine à concevoir un jeu Unity 2D, type Mario. et je désire faire un système de checkpoint. Ainsi, je joueur pourrait revivre au dernier chechpoint après avoir vu une publicité (Rewarded AD). donc la partie pub, ça fonctionne, après visionnage, il y "recharge de la partie" et replacement du personnage au premier checkpoint.

le problème est que : il revient toujours au premier cherckpoint, il n'enregistre pas les coordonèes des checkpoints suivant, j'ai tout essayé : j'ai mis les checkpoint en prefabs, je les ai sorti, j'ai essayé de les faire séparément, j'ai essaye une courotine, pour effacer les donner et les recharger après nouvelle collision er rien n'y fait, il revient toujours au premier checkpoint. ci-joint, mon script

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckPoint : MonoBehaviour
{
    
     private void OnTriggerEnter2D(Collider2D collision){
         if(collision.CompareTag("Player")){
            PlayerPrefs.SetFloat("x",gameObject.transform.position.x);
            PlayerPrefs.SetFloat("y",gameObject.transform.position.y);
            PlayerPrefs.SetFloat("z",gameObject.transform.position.z);
         }
     }
    
     public void Update(){
   
       if(PlayerPrefs.GetInt("isRewarded")== 1  ){ 

            float x = PlayerPrefs.GetFloat("x");
            float y = PlayerPrefs.GetFloat("y");
            float z = PlayerPrefs.GetFloat("z");      
            GameObject.FindGameObjectWithTag("Player").transform.position = gameObject.transform.position;
            GameOverManager.instance.isRewarded = 0;
            PlayerPrefs.SetInt("isRewarded", 0);
        }         
    }

}

donc au final, s'il y a collision avec le checkpoint, les coordonnées du checkpoint sont sauvegardé et après, si la publicité est vue, le joueur est replacé au checkpoint. la recharge du niveau est dans un autre script et de toute façon ça ne pause pas de problèmes.

merci de m'avoir lu ;)

youtpout
Messages : 58
Inscription : 15 Nov 2020 15:54

Re: checkpoint playerpref

Message par youtpout » 29 Jan 2021 12:23

Je crois qu’il faut que tu appels la méthode save de playerprefs après les sets

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5553
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: checkpoint playerpref

Message par boubouk50 » 29 Jan 2021 12:29

Salut,

A aucun moment tu n'utilises x, y et z. Donc tout ce que tu fais, c'est écrire et lire des variables, sans les utiliser. Elles sont donc inutiles.
Aussi, je suppose que chaque CheckPoint possède ce script. Donc actuellement, après un reward, tu affectes à la position du Player la position de chacun des CheckPoint. Par un hasard, c'est toujours le premier qui revient.
La logique de ce code n'est donc pas bonne.

Si tu veux garder cette logique bourrine, il te faut juste reconstruire un Vector3 à partir des données x, y ,z et de l'injecter dans la position de ton player et c'est bon.

Maintenant, dans une meilleure logique, la position du Player devrait être effectuée dans la classe Player au moment du respawn et pas du CheckPoint. (Il s'en fout le CheckPoint, l'info ne dépend pas de lui mais du PlayerPrefs).
Quand tu dois le respawn, tu vérifies si la pub a été vue, si oui, tu lui affectes la position x, y, z, celle de départ sinon.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

jones
Messages : 7
Inscription : 29 Jan 2021 11:01

Re: checkpoint playerpref

Message par jones » 29 Jan 2021 19:05

merci boubouk!!! tu m'as inspiré et du coup j'ai finalement trouvé une solution qui fonctionne parfaitement que je pose ici pour ceux qui en auront besoin.

alors ça c'est le script sur chaque CheckPoint :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class takeCheckpoint : MonoBehaviour
{
    
     public Transform checkpoint;
    
     public float posX;
    public float posY;
     public float posZ;

     public void Start(){

             posX = checkpoint.position.x;      
             posY = checkpoint.position.y; 
             posZ = checkpoint.position.z; 

     }
     public void OnTriggerEnter2D(Collider2D collision){
         if(collision.CompareTag("Player")){
            PlayerPrefs.SetFloat("x",posX);
            PlayerPrefs.SetFloat("y",posY);
            PlayerPrefs.SetFloat("z",posZ);
            }
          }
  
}
et ça c'est un script sur un empty ou qu'on pourrait poser dans le script du Player comme tu me l'avais recommandé;

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckPoint : MonoBehaviour
{
    public takeCheckpoint positionCheck;
    
    public void Start(){

  

     }
    
     public void Update(){
   
       if(PlayerPrefs.GetInt("isRewarded")== 1  ){ 
           
            Debug.Log(positionCheck.posX);

            positionCheck.posX = PlayerPrefs.GetFloat("x");
            positionCheck.posY = PlayerPrefs.GetFloat("y");
            positionCheck.posZ = PlayerPrefs.GetFloat("z");      
            GameObject.FindGameObjectWithTag("Player").transform.position = new Vector3(positionCheck.posX,positionCheck.posY,positionCheck.posZ);
            GameOverManager.instance.isRewarded = 0;
            PlayerPrefs.SetInt("isRewarded", 0);
        }         
    }
     
}
et merci de ton aide :-D

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5553
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: checkpoint playerpref

Message par boubouk50 » 29 Jan 2021 19:34

Alors comme dit, ça marche, mais c'est bourrin.
Ici, tu fais ça dans un Update () c'est à dire que celui-ci est calculé X fois par secondes, X étant ton frameRate (disons 60 fps). Alors que tu n'en as réellement besoin qu'une seule fois, quand la variable change.
Donc au lieu de le mettre dans l'Update () tu peux simplement faire une fonction qui sera appelée lorsque la variable isRewarded est modifiée.
Ce changement tu dois savoir quand il est opéré puisque c'est lors de la lecture de la pub.
Le joueur la regarde (en entier) ou non donc tu sais à quel moment tu la modifies. Si tu la modifies, alors tu peux appeler cette fonction à ce moment là.
Soit par un Event soit par une référence, etc.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

jones
Messages : 7
Inscription : 29 Jan 2021 11:01

Re: checkpoint playerpref

Message par jones » 29 Jan 2021 20:06

tu penses que ce que j'ai mis dans Update, je peux tout simplement le mettre dans Start ()?
normalement ça marchera mais du point de vue optimisation?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5553
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: checkpoint playerpref

Message par boubouk50 » 01 Fév 2021 09:20

Non, tu ne peux pas le mettre dans le Start ().
Le Start () est joué une seule fois à l'activation du GameObject, toi tu veux pouvoir l'appeler à tout moment.
Tu crées une fonction nouvelle pour ça (ex: public void SetPositionFromCheckPoint) pour le player.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »