[RESOLU]Instatiate gameobject et ne pas l'instatiate si déjà ramassé

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
Ynua
Messages : 13
Inscription : 07 Nov 2018 15:21

[RESOLU]Instatiate gameobject et ne pas l'instatiate si déjà ramassé

Message par Ynua » 22 Juil 2019 11:25

Bonjour !

Je suis actuellement en train de développer un jeu ou le principe est simple: Plusieurs niveaux avec plusieurs objets à ramasser (dans chaque niveau, 5 objets à récupérer).

Là où je bloque, c'est que lorsque je ramasse un objet dans mon niveau 1 (par exemple), et que je retourne dans le niveau 1, mon objet est toujours là, donc le joueur peut le ramasser à l'infini et ça n'a plus aucun intérêt.
Ce que j'aimerai c'est qu'une fois l'objet ramassé, il n’apparaisse plus jamais. JAMAIS.

Donc j'ai essayé plusieurs choses, mais j'ai échoué lamentablement à chaque tentative, voici pourquoi je me retrouve ici aujourd'hui pour implorer votre aide.

Code : Tout sélectionner

 	public GameObject[] items;
   	public Vector3[] spawnPoints;
    	private int itemsTrigger;

	void Start()
    	{
        	itemsTrigger = SaveManager.Instance.state.itemTrigger;
       		int spawnIndex = spawnPoints.Length - 1;
        	Quaternion spawnRotation = Quaternion.identity;

       		if(itemsTrigger < 5)
      		{
            		for(int i = 0; i < items.Length; i++)
            		{ 
              	  		Instantiate(items[i], spawnPoints[i], spawnRotation);
                		SaveManager.Instance.state.itemTrigger++;
                		SaveManager.Instance.Save();
            		}
        	}
       		else
        	{
            		for(int i = 0; i < items.Length; i++)
            		{
               			 items[i].SetActive(false);
            		}
        	}
        
    	}
  	
Dans ce code ci-dessus, mes objets s'instantie correctement, mais lorsque j'en ramasse un sur cinq et que je retourne dans mon niveau 1, les cinq disparaissent.
J'ai essayé d'autres choses, notamment avec PlayersPrefs, mais comme cette tentative, elle a échoué.

Merci d'avance pour toute aide qui me sera apportée et pour le temps consacré :merci:
Dernière édition par Ynua le 23 Juil 2019 14:18, édité 1 fois.

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

Re: [DB-AL]Instatiate gameobject et ne pas l'instatiate si déjà ramassé

Message par Alesk » 22 Juil 2019 16:26

Salut,

Il faudrait que tu gardes à part un Array ou une List qui mémorise la liste des items récupérés dans chaque niveau.
Ensuite tu te fies à cette liste pour savoir si tu peux instancier un item ou non lors de l'init du niveau.

Là il te faudrait une liste de listes : la liste "mère" représente la liste des niveaux et chaque entrée de cette liste contient la liste des items ramassés, identifiés par leurs index dans ta liste de spawnpoints d'items.

Lorsque tu es dans le niveau 1 et que tu ramasse l'item 3, tu rajoutes la valeur 3 dans la liste correspondant au niveau 1.

Bien entendu cette liste doit perdurer entre deux chargements de scènes, il faut donc coller le script qui gère ça sur un gameobject persistent.

Ynua
Messages : 13
Inscription : 07 Nov 2018 15:21

Re: [DB-AL]Instatiate gameobject et ne pas l'instatiate si déjà ramassé

Message par Ynua » 22 Juil 2019 16:57

Salut, merci de ta réponse !

Quand tu dis garder un Array ou une List à part, tu veux dire dans un autre script que celui là, et qui appellerait ce script là pour vérifier si j'ai oui ou non déjà récupéré l'item ?

Mon script actuel est placé sur un gameobject dans chaque niveau, donc celui que je créerai, serait sur un gameobject DontDestroyOnLoad qui apparaîtrait dans chacun de mes niveaux, c'est bien ça ?

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

Re: [DB-AL]Instatiate gameobject et ne pas l'instatiate si déjà ramassé

Message par Alesk » 22 Juil 2019 17:11

T'as tout compris :mrgreen:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL]Instatiate gameobject et ne pas l'instatiate si déjà ramassé

Message par boubouk50 » 22 Juil 2019 17:26

J'ajoute une seule chose, vu que l'info de persistance outGame n'est pas précisée, cette solution n'est fonctionnelle seulement si le jeu n’est pas coupé, donc ton joueur devra tout recommencer depuis le début à chaque restart de l'application. Pour avoir une persistance entre les sessions, il te faudra passer par les PlayerPrefs par exemple.
"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

Ynua
Messages : 13
Inscription : 07 Nov 2018 15:21

Re: [DB-AL]Instatiate gameobject et ne pas l'instatiate si déjà ramassé

Message par Ynua » 23 Juil 2019 14:17

Merci, merci infiniment à tout les deux !
Je devrais pouvoir m'en sortir maintenant :merci:

Répondre

Revenir vers « (C#) CSharp »