[DB-AL] C# Afficher/Masquer des GameObject taggués

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
Kazuma17
Messages : 33
Inscription : 29 Août 2017 15:56

[DB-AL] C# Afficher/Masquer des GameObject taggués

Message par Kazuma17 » 12 Sep 2017 11:43

Bonjour ! :-D
Je débute dans le scripting sous Unity et je ne suis pas encore très à l'aise avec le C#, je pense savoir comment procéder pour que mon code fonctionne mais j'ai des difficultés à l'écrire, et je n'arrive pas à me corriger.. :?

Je veux pouvoir afficher ou masquer des groupes d'objets dans une scène :
Pour cela je procéderais avec un système de calques en tagguant chaque groupe d'objet, auxquels on pourrait activer ou désactiver le meshrenderer à l'aide d'un booléen publique, qu'on cocherait ou décocherait.

J'ai écris ceci, ne vous moquez pas :hehe:

Code : Tout sélectionner

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

public class Calques : MonoBehaviour {

	public bool afficher = false;

	void Update (){
	if(afficher == true)
	{
			GameObject.FindGameObjectsWithTag ("Test");
		GetComponent(MeshRenderer).enabled = true;
	}
	else
	{
			GameObject.FindGameObjectsWithTag ("Test");
		GetComponent(MeshRenderer).enabled = false;
		}}}
Unity me dit que le meshrenderer est un type mais est utilisé comme une variable, je ne comprends pas..

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

Re: [DB-AL] C# Afficher/Masquer des GameObject taggués

Message par boubouk50 » 12 Sep 2017 12:18

Salut,

GameObject.FindGameObjectsWithTag ("Test");, cette ligne te permet de récupérer les GameObjects qui ont le Tag Test. Mais, il faut les stocker quelque part, ce que tu ne fais pas.

GetComponent(MeshRenderer).enabled = true; Cette ligne te permet d'activer le rendu du gameObject en question, c'est à dire celui sur lequel ce script est apposé, donc pas les GameObjects (sensés être) récupérés plus haut.

Enfin, Update () est une fonction qui est appelée à CHAQUE frame, donc 60 fois par secondes pour du 60 fps. Tu n'as pas besoin de masquer ou afficher tes gameObjects à chaque frame, seulement quand tu le décides.
Il faudrait donc créer une fonction qui serait appelée soit par un événement, soit par une condition unique depuis un Update ()
"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

Kazuma17
Messages : 33
Inscription : 29 Août 2017 15:56

Re: [DB-AL] C# Afficher/Masquer des GameObject taggués

Message par Kazuma17 » 12 Sep 2017 17:44

Hello, merci pour ta réponse, je rame ..
Ce code fonctionne sur mon objet seul mais pas sur les tags, effectivement les tags récupérés ne sont réutilisés nul part, comment dois-je m'y prendre ?
Comme tu peux le voir ci-dessous j'ai initialisé les tags dans une variable "groupe", mais le problème est le même je ne sais pas comment déclarer le "groupe" (ce n'est pas un int, pas un bool ...), je dois manquer de certains éléments...
Idem pour l'appel d'une fonction autre que Update, je ne vois pas comment m'y prendre, j'ai beau retourner la doc Unity, ou les sujets similaires ils sont trop anciens et le code est obsolète, je désespère ...

Voici où j'en arrive :

Code : Tout sélectionner

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

public class Calque : MonoBehaviour {

		public bool afficher = true;


	void Start ()
	{
		groupe = GameObject.FindGameObjectsWithTag ("Test");
	}
		
	void Update ()
	{
			if(afficher == true )
			{
			gameObject.GetComponent<Renderer>().enabled = true;
			}
			else
			{
			gameObject.GetComponent<Renderer>().enabled = false;
			}
		}
	}


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

Re: [DB-AL] C# Afficher/Masquer des GameObject taggués

Message par boubouk50 » 13 Sep 2017 09:27

Il me manque encore un élément: Comment est déclenché l'affichage de ces gameObjects? Bouton? Input?

Code : Tout sélectionner

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

public class Calque : MonoBehaviour {

	public bool afficher = true;
	private GameObject[] groupe; //Il faut déclarer ton tableau de GameObjects

	void Start ()
	{
		//Récupération des GameObjects tagués Test au départ de la scène
		groupe = GameObject.FindGameObjectsWithTag ("Test");
	}
		
	private void DisplayGroup ()
	{
		//Pour chaque gameObject dans le tableau de gameObject
		//Activer ou non son rendu -> Attention cela ne désactive pas le reste, juste le rendu. Si tu veux que tes gameObjects ne soient plus interactifs, il te faut plutôt utiliser go.SetActive (afficher)
		foreach (GameObject go in groupe) {
			go.GetComponent <Renderer>().enabled = afficher;
		}
	}
}
"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

Kazuma17
Messages : 33
Inscription : 29 Août 2017 15:56

Re: [DB-AL] C# Afficher/Masquer des GameObject taggués

Message par Kazuma17 » 13 Sep 2017 10:55

D'accord... merci j'y vois beaucoup plus clair ! ;-)

Aucune interaction avec les objets autre que les faire apparaître/disparaître donc c'est ok :)

Il me faudrait une UI avec le nom des tags à afficher/masquer, et en cochant ou non la case le groupe taggué apparaît.

J'ai tenté le coup avec un void OnGUI, ici sur le bouton j'ai juste mis "Cube" car je fais l'essai sur un cube avec le tag Test. Mais ce n'est pas très intuitif pour l'utilisateur, il me faudrait plutôt une UI dans le même genre mais avec des cases à cocher...
Quand je clique sur le bouton ça me coche/décoche bien "afficher", mais mon cube ne disparaît pas..

Je me pose une autre question, le script je le pose sur quoi, sur un objet de chaque tag ?

Voici mon code :

Code : Tout sélectionner

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

public class Calque : MonoBehaviour {

	public bool afficher = true;
	private GameObject[] groupe;

	void Start ()
	{
		groupe = GameObject.FindGameObjectsWithTag ("Test");
	}

		void OnGUI() {
		if (GUILayout.Button ("Cube"))
			afficher = !afficher;
	}

	private void DisplayGroup ()
	{
		foreach (GameObject go in groupe) 
		{
			go.GetComponent<Renderer> ().enabled = afficher;
		}
	}
									}

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

Re: [DB-AL] C# Afficher/Masquer des GameObject taggués

Message par boubouk50 » 13 Sep 2017 11:15

Ce script gère tous les tags, donc il ne doit apparaître qu'une seule fois dans ta scène. Tu peux le mettre n'importe où, puisqu'il n'interagit pas avec le gameObject associé. Néanmoins pour de la lisibilité, tu peux te créer un empty GameObject pour l'apposer.

Alors ici, je n'ai défini qu'une fonction qui te permet d'afficher/masquer tes gameObjects du tag Test. Il te faut lk'appeler pour qu'elle soit effective. C'est à dire, que non seulement tu changes la valeur de afficher, mais aussi il te faut appeler la fonction DisplayGroup ().
Ensuite, au lieu d'écrire en dur Test, il te faudra le paramétrer pour n'importe quel nom de tag.
Aussi, au lieu de récupérer les gameObjects au départ pour un tag, il te faudra le paramétrer pour chaque tag ne tant réel (pour ne pas stocker tous les gameObjects de ta scène)
Aussi, il te faudra savoir l'état d'affichage pour chaque tag. -> paramétrer afficher.
Aussi, il te faudra récupérer chaque tag existant -> Un bouton pour chaque tag ou bien une liste déroulante, etc.
Il y a encore un peu de chemin jusque là.

Code : Tout sélectionner

void OnGUI() {
		if (GUILayout.Button ("Cube")) {
			afficher = !afficher;
			DisplayGroup ();
		}
"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

Kazuma17
Messages : 33
Inscription : 29 Août 2017 15:56

Re: [DB-AL] C# Afficher/Masquer des GameObject taggués

Message par Kazuma17 » 14 Sep 2017 11:43

C'est bon j'ai la base, me reste plus qu'à mettre ça sous forme de liste à cocher plutôt que sous boutons ! :-D

Par contre le code sera long, comment pourrait-on l'optimiser ?

Code : Tout sélectionner

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

public class Calque : MonoBehaviour {

	public bool afficher1 = true;
	public bool afficher2 = true;
	private GameObject[] groupe;

		void OnGUI() {
		if (GUILayout.Button ("Cube")) {
			afficher1 = !afficher1;
			DisplayGroup1 ();
		}
		if (GUILayout.Button ("AutreElement")) {
			afficher2 = !afficher2;
			DisplayGroup2 ();	
		}
	}

	private void DisplayGroup1 ()
	{
		groupe = GameObject.FindGameObjectsWithTag ("Test");
		foreach (GameObject go in groupe) 
		{
			go.GetComponent<Renderer> ().enabled = afficher1;
		}
	}
		private void DisplayGroup2 ()
		{
			groupe = GameObject.FindGameObjectsWithTag ("AutreElement");
			foreach (GameObject go in groupe) 
			{
				go.GetComponent<Renderer> ().enabled = afficher2;
			}
		}
									
}

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

Re: [DB-AL] C# Afficher/Masquer des GameObject taggués

Message par boubouk50 » 14 Sep 2017 12:00

Comme pour les GameObjects, utiliser des tableaux, ou plutôt des listes voire une structure.
Au démarrage, tu crées automatiquement une dropdownlist avec autant d'entrée que de tag, puis avec cela, tu vas créer une liste de booléen et une liste de gameObjects par tag. Ensuite chaque entrée de ta dropdownlist aura pour effet de n'affecter qu'un seul élément de tes tableaux (celui correspondant à l'index du tag).
Si tu utilises une structure (du coup, va voir des docs la dessus si tu ne connais pas), tu peux lier tout cela en un seul bloc.

Question: pourquoi les tags et pas les layers?
Par layer, tu peux utiliser le Culling Mask de la caméra pour ne pas rendre les éléments de certains layers. Ainsi, tu n'aurais plus à gérer chaque gameObject mais juste les index des layers sur la caméra...
"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 »