[RESOLU] Mettre une variable GO à null

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

[RESOLU] Mettre une variable GO à null

Message par Edrahil511 » 31 Mars 2021 07:45

Bonjour,

Je cherche à résoudre le problème suivant (en réalité je l'ai résolu mais de manière tellement sale que je peux pas laissé ca dans mon code :lol: )

J'ai dans mon script une variable GameObject monObjet;


J'ai une fonction qui ressemble à cela que j'appel dans mon script

Code : Tout sélectionner

public void InstantiateObject()
{
	If(monObjet == null)
	{
		monObjet = Instantiate(monPrefab, position, rotation);
	}
}

Puis un évènement doit remettre ma variable monObjet à null pour que ma fonction puisse en instancier un nouveau mais je n'arrive pas à remettre monObjet à null.
Dernière édition par Edrahil511 le 31 Mars 2021 14:02, édité 1 fois.

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

Re: Mettre une variable GO à null

Message par boubouk50 » 31 Mars 2021 09:29

Image

Code : Tout sélectionner

monObjet = null;
Ou alors c'est la mise en place de l'Event que tu n'as pas compris??
https://learn.unity.com/tutorial/events-uh?language=en

Aussi, if pas If.
"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

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: Mettre une variable GO à null

Message par Edrahil511 » 31 Mars 2021 10:11

Premièrement je suis pas du genre à troller sur un forum ....
boubouk50 a écrit :
31 Mars 2021 09:29
Ou alors c'est la mise en place de l'Event que tu n'as pas compris??
https://learn.unity.com/tutorial/events-uh?language=en
Ca c'est possible, à première vu je ne vois pas à quoi correspond ce terme, je me renseigne la dessus alors ?

J'imagine que c'est quelque chose d'important au vu de ta réaction.

Ce qui m'étonne c'est comment j'ai pu passer à coté jusque la (même si ca fait seulement 1 ans environs maintenant que j'apprend à titre amateur à utiliser Unity)

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

Re: Mettre une variable GO à null

Message par boubouk50 » 31 Mars 2021 11:06

Edrahil511 a écrit :
31 Mars 2021 07:45
Puis un évènement doit remettre ma variable monObjet à null pour que ma fonction puisse en instancier un nouveau mais je n'arrive pas à remettre monObjet à null.
Je crois que tu n'as juste pas posé ta question correctement.
Le mot événement (ou Event) est un terme de programmation, du coup, la phrase prend un autre sens pour moi, puisque cela signifiait que tu as mis en place un Event pour remettre la variable à null.

Peux-tu donc reformuler ton besoin?
Pas mettre une variable à null (c'est évident de faire = null) mais ce que tu cherches à faire, ce que tu veux mettre en place, dans quelle condition.
Plus ta question sera précise et explicite, plus la réponse sera adaptée.
"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

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: Mettre une variable GO à null

Message par DevAmat » 31 Mars 2021 11:15

Salut,

La fonctionne qui créé ton objet est appelé dans une boucle ou occasionnellement?
L'objet que tu instancies est ensuite détruit puis tu veux en créer un autre?

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: Mettre une variable GO à null

Message par Edrahil511 » 31 Mars 2021 13:17

Désolé j'ai voulu faire court pour faire simple et éviter de raconter des détails pouvant être inutile mais je vais développer alors en expliquant le contexte, et je comprend que utiliser le terme "Evenement" était très mal choisi car il à dans mon cas aucun rapport avec les EventsUnity

Par contre je suis encore dans les balbutiements de mon apprentissage alors je gère peut être (sans doute) mal des choses surtout que je code un peu à la volé déjà pour avoir une idée de mon projet. Bref !

J'ai plusieurs cubes dans ma scène, possédant chacun un SOobject dans lequel il y a entre autre un gameObject monstre

Mon but final se fait en deux étapes :

1 - Lorsque je place mon curseur souris sur un cube, le monstre apparait au dessus du cube. Lorsque je retire ma souris il disparait.

2 - Si je clique sur un cube et que je valide avec un bouton de mon canvas, tout mes cubes disparaissent et je me retrouve avec le monstre du cube sélectionné qui suit mon curseur souris pour le placer dans ma scène en bougeant ma souris et validant sa position avec un clic.

L'étape 2 fonctionne sans soucis.



pour gérer l'affichage lorsque je survole un dé j'ai un morceau de code qui est le suivant :

Code : Tout sélectionner

 if (hit.collider.tag == "Dice") //hit est mon raycast pour savoir ce que pointe la souris
            {
                hit.collider.GetComponent<Dice>().ColorDice(true); //Dice sont mes cubes
                if (mouseOnDice == false) // pour éviter d'instancier un nombre infini d'objet lorsque ma souris reste sur le cube
                {
		mouseOnDice = true;

                    GameObject monster = Instantiate(hit.collider.gameObject.GetComponent<Dice>().GetMonster().model3D, new Vector3(hit.collider.transform.position.x, hit.collider.transform.position.y + 0.6f, hit.collider.transform.position.z) , Quaternion.identity) ;

                    monster.GetComponent<MonsterAction>().SetMonster(gameManager.GetComponent<GameManager>().GetPlayer(0), hit.collider.gameObject.GetComponent<Dice>().GetMonster(), true);
                    
                }
Pour gérer l'étape 1 j'ai ajouté un booléen dans le script de mon monstre pour savoir si il est temporaire (dans la scène lorsque on survole un dé) ou définitif (dans la scène lorsque l'on a choisi le cube et qu'on est à la phase ou l'on place le model3D)

Ici ma fonction SetMonster()

Code : Tout sélectionner

    
    public void SetMonster(PlayerStat currentPlayer, SOMonster monster, bool tempo)
    {
   	playerOwned = currentPlayer;
	soMonster = monster;
	tempoMonster = tempo; //tempo == true (monstre temporaire) // tempo== false (monstre définitif)
        
    }
Lorsque ma souris ne se trouve plus sur un dé je Destroy tout les monstres ayant tempo==true comme ci dessous

Code : Tout sélectionner

GameObject[] monster;
monster = GameObject.FindGameObjectsWithTag("Monster");
foreach(GameObject var in monster)
{
	if(var.GetComponent<MonsterAction>().IsTempo() == true)
	{
		Destroy(var.gameObject);
	}
}
mouseOnDice = false;



Maintenant pour valider le cube choisi et placer le monstre correspondant voici la partie intéressante que j'ai fait :

Code : Tout sélectionner


                if (monsterInDice == null)
                {
                    
                    monsterInDice =  Instantiate(diceMonster.model3D, new Vector3(tilePos.x + afix.x + 0.5f, 0, tilePos.y + afix.y  + 0.5f), Quaternion.identity);
                    
                    monsterInDice.GetComponent<MonsterAction>().SetMonster(gameManager.GetComponent<GameManager>().GetPlayer(0), diceMonster, false);
                }         
monsterInDice est une variable GameObject déclaré en début de script que j'utilise pour pouvoir accéder au transform et ainsi déplacer avec le curseur souris mon monstre instancié .

Quand je valide mon monstre est bien positionné et ne bouge plus mais je doit rendre ma variable monsterInDice Null (dans le if qui se déclenche quand je clique sur ma souris pour valider la position de mon monstre) pour qu'on prochain tour je passe bien dans le if ci dessus et qu'il m'instancie bien un autre monstre.
A l'heure actuel mon systeme marche 1 fois mais pas deux car une fois validée il ne rentre pas dans mon if (vu que je n'ai pas réussi à mettre monsterInDice à Null et donc ne m'instancie pas mon monstre)

Je sais pas si c'est clair et si j'ai mis les bonnes info mais j'ai essayé de faire au mieux.

Merci
Dernière édition par Edrahil511 le 31 Mars 2021 13:36, édité 1 fois.

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: Mettre une variable GO à null

Message par Edrahil511 » 31 Mars 2021 13:24

DevAmat a écrit :
31 Mars 2021 11:15
Salut,

La fonctionne qui créé ton objet est appelé dans une boucle ou occasionnellement?
L'objet que tu instancies est ensuite détruit puis tu veux en créer un autre?
Alors avec les explications ci-dessus :
Les fonctions qui créé (instancie on est d'accord ?) mon objet se trouve

dans le (hit.collider.tag == "Dice") quand j'instancie un objet qui sera voué à être détruit car temporaire.

Mais c'est surtout celui qui se trouve dans ma fonction qui valide le cube choisi qui est intéressant et qui pose problème. Celle ci n'est appelé qu'une fois (en appuyant sur le bouton de mon Canvas). A ce moment la j'instancie un monstre avec son tempoMonster = false .

Edrahil511
Messages : 19
Inscription : 13 Déc 2020 16:54

Re: [RESOLU] Mettre une variable GO à null

Message par Edrahil511 » 31 Mars 2021 14:07

Ok, bon .... tant pis je vais passer pour un con mais du coup j'ai re essayer avec monObjet = null et ca marche visiblement ..... c'est bizarre car c'était le premier truc que j'avais essayé, ca me paraissait évident et vu que quand un truc marche pas je change plein de chose partout pour essayé de comprendre, si ca se trouve j'avais placé mon monObjet = null au mauvais endroit la première fois sans y faire gaffe et en me focalisant sur l'idée que c'était ma syntaxe qui était mauvaise.

Mea culpa pour ce post inutile .... :amen:

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: [RESOLU] Mettre une variable GO à null

Message par DevAmat » 31 Mars 2021 14:23

C'est parfois juste en exprimant son problème que l'on trouve la solution ;-) ..

Répondre

Revenir vers « Scripting »