Page 1 sur 1

level Selctor ETOILES

Publié : 18 Fév 2021 17:25
par jones
Salut tout le monde, j'espère que vous allez bien.
Alors voilà, je travail sur un petit jeu 2D, façon Mario, tout fonctionne à merveille et là j'ai une idée :
rajouter un système d'étoiles. Ainsi, le joueur pourra récupérer une, 2 ou 3 étoiles su chaque niveau qui s'afficheront par la suite sur le bouton du dit-niveau. Et c'est là, où j'ai bloqué : en partie ca fonctionne, sauf que les étoiles, apparaissent sur tous les boutons de tous les nivaux et non-pas celui concerné, alors j'ai tout essayé et j'ai vu tous les tutos mais rien n'y fait, j'allais abandonner cette idée quand j'ai pensé au forum. Donc vous êtes ma dernière chance :P .
Alors je partage avec vous mes scripts que je pense concerné par le problème, en espérant que vous puissiez m'aider.

c'est le script que j'ai rajouté sur chaque bouton de niveau :

Code : Tout sélectionner

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

public class starLevelShow : MonoBehaviour
{
    public GameObject star1;
    public GameObject star2;
    public GameObject star3;
    // Start is called before the first frame update
    void Start()
    {  
         if(PlayerPrefs.GetInt("saveStar1")== 1  ){ 
               star1.SetActive(true);
        }
        if(PlayerPrefs.GetInt("saveStar2")== 1  ){ 
               star2.SetActive(true);
        }
        if(PlayerPrefs.GetInt("saveStar3")== 1  ){ 
               star3.SetActive(true);
        }
        
    }
ici une partie du script qui permet de sauvegarder les étoiles :

Code : Tout sélectionner

if(Inventory.instance.star1Count== 1  ){ 
          star1.SetActive(true);
          saveStar1=1;
           PlayerPrefs.SetInt("saveStar1", 1);
         }
          if(Inventory.instance.star2Count== 1  ){ 
          star2.SetActive(true);
          saveStar2=1;
          PlayerPrefs.SetInt("saveStar2", 1);
         }
          if(Inventory.instance.star3Count== 1  ){ 
          star3.SetActive(true);
          saveStar3=1;
          PlayerPrefs.SetInt("saveStar3", 1);
         }
c'est le script qui permet de gérer les boutons des niveaux :

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;


public class LevelSelector : MonoBehaviour
{
    public Button[] levelButtons;

    private void Start(){

        int levelReached= PlayerPrefs.GetInt("levelReached", 1);

        for (int i = 0; i < levelButtons.Length; i++)
        {
            if(i+1 > levelReached){
              levelButtons[i].interactable=false;
            }
        }
    }

   public void LoadLevelPassed(string levelName){
       SceneManager.LoadScene(levelName);
   }
}
Je me rend bien compte, que j'en demande trop, je suis désolé de vous ennuyer, mais j'ai vraiment désespéré...

Re: level Selctor ETOILES

Publié : 18 Fév 2021 18:17
par boubouk50
Salut,

J'ai vite fait zieuté, et je vois déjà quelques petits problèmes de conception:
- Tous les gameObjects possédant le Component StartLevelShow utilisent les 3 mêmes PlayersPrefs (saveStar1, saveStar2 et saveStar3)
Au Start, tous tes niveaux prendront donc exactement le même nombre d'étoiles.
Il te faudrait donc avoir un nom de clé de PlayerPref dépendant de l'objet, le nom du gameObject peut-être?

Optimisation:
Utilise des tableaux et stocke le nombre d'étoiles au lieu d'un entier pour chaque étoile.
C'est plus clair, plus simple et s'adaptera à n'importe quel nombre d'étoiles entrées dans le tableau stars.

Code : Tout sélectionner

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

public class starLevelShow : MonoBehaviour
{
    //Crée un tableau de gameObject ou tu entreras tes gameObjects étoile
    public GameObject[] stars;
    
    // Start is called before the first frame update
    void Start()
    {  
    	//Récupère le nombre d'étoiles (0, 1, 2 ou 3) tu pourrais mettre 5 étoiles que ce code fonctionnerait toujours.
    	//J'ai donné le nom du gameObject, assure toi que chacun des gameObjects possède un nom différent
     	int starCount = PlayerPrefs.GetInt(this.name);
     	
     	//Pour chaque étoile, j'active ou non l'étoile associée.
     	for (int i=0; i<starCount; i++)
     	{
     		stars[i].SetActive (true);
     	}
    }
 }