Page 1 sur 1

[RESOLU] Mettre une variable GO à null

Publié : 31 Mars 2021 07:45
par Edrahil511
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.

Re: Mettre une variable GO à null

Publié : 31 Mars 2021 09:29
par boubouk50
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.

Re: Mettre une variable GO à null

Publié : 31 Mars 2021 10:11
par Edrahil511
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)

Re: Mettre une variable GO à null

Publié : 31 Mars 2021 11:06
par boubouk50
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.

Re: Mettre une variable GO à null

Publié : 31 Mars 2021 11:15
par DevAmat
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?

Re: Mettre une variable GO à null

Publié : 31 Mars 2021 13:17
par Edrahil511
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

Re: Mettre une variable GO à null

Publié : 31 Mars 2021 13:24
par Edrahil511
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 .

Re: [RESOLU] Mettre une variable GO à null

Publié : 31 Mars 2021 14:07
par Edrahil511
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:

Re: [RESOLU] Mettre une variable GO à null

Publié : 31 Mars 2021 14:23
par DevAmat
C'est parfois juste en exprimant son problème que l'on trouve la solution ;-) ..