level Selctor ETOILES

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
jones
Messages : 7
Inscription : 29 Jan 2021 11:01

level Selctor ETOILES

Message par jones » 18 Fév 2021 17:25

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é...
Pièces jointes
Sans titre.png
Sans titre.png (155.21 Kio) Consulté 42 fois
Sans titre.png
Sans titre.png (155.21 Kio) Consulté 42 fois

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

Re: level Selctor ETOILES

Message par boubouk50 » 18 Fév 2021 18:17

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);
     	}
    }
 }
"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 « (C#) CSharp »