[DB - AL] Scripter un import de texture sur un gameObject

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
Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB - AL] Scripter un import de texture sur un gameObject

Message par Max » 18 Jan 2018 19:44

Bonsoir,
Kazuma17 a écrit :
18 Jan 2018 17:55
Je me heurte à un nouveau problème... Je sais accéder au composant d'un script et donc réutiliser la variable dont tu me parlais boubouk50, le soucis étant que le script n'est pas en Monobehaviour mais en UIBehaviour et je pense que pour cette raison je ne peux pas y accéder, auriez-vous des pistes sur la manière de s'y prendre ?

Code : Tout sélectionner

public class FileBrowser : UIBehaviour {
UIBehaviour dérive de MonoBehaviour, donc cela ne devrait pas te poser de soucis.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: [DB - AL] Scripter un import de texture sur un gameObject

Message par Farstone » 19 Jan 2018 00:47

C'est quoi ta manière pour aller chercher le string FileName ? Fait attention de ne pas crée une nouvelle instance du script FileBrowser, mais bien de pointer vers celui qui contient ton string. Si ton script FileBrowser ce trouve dans l'inspecteur, fait une variable null de FileBrowser dans le script qui doit récupérer le string.
public FileBrowser variableVide;

Et glisse dans l'inspecteur le GO contenant le script FileBrowser dans la variable "variableVide". Tu a maintenant la même instance et tu peux faire myString = variableVide.FileName; (Tu peux aussi faire des "variable = GetComponent" si ça te chante).

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

Re: [DB - AL] Scripter un import de texture sur un gameObject

Message par Kazuma17 » 19 Jan 2018 15:38

Cool, merci pour votre intérêt à mon problème. :-D

Le soucis c'est que j'avais déclaré l'explorateur de fichier en gameObject et non en FileBrowser ! J'ai maintenant accès à FileName. :)

Mais nouveau problème, en faisant ça mon code n'est plus bon pour les endroits où j'avais déjà déclaré l'explorateur de fichier, comme c'est maintenant de l'UI la syntaxe n'est peut-être pas la même ? Je n'ai pas trouvé les équivalents en terme d'UI. C'est la raison pour laquelle mon explorateur de fichier est présent deux fois dans le code, une en tant que gameObject pour conserver mon ancien code et une en FileBrowser (mais les deux pointent sur le même élément), je ne suis vraiment pas certain que ce soit la bonne manière de faire...

Voici mon code, je bloque sur le fait que je n'arrive pas à déclarer ma variable stockant les mesh à texturer, c'est la variable "children" mais comme je la définis dans le OnMouseDown elle est null dans ma fonction Texturing(), sauf que si je la déclare globalement je ne peux pas utiliser le "this" pour savoir qu'on recherche sur l'objet cliqué :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using uFileBrowser;

public class OnMouseDownScript : MonoBehaviour {

	public GameObject explorateurFichier;
	public FileBrowser fileBrowser;
	public Text txtSupportActif;
	GameObject children;


	public void OnMouseDown()		// Au clic sur gameObject : affiche le FileBrowser et le nom du support sélectionné et trouve la surface à texturer. 
	{
		explorateurFichier.SetActive (true);
		txtSupportActif.text = this.name;
		string support = this.gameObject.name;
	

		if (this.transform.Find ("VISUEL").gameObject) {
			Debug.Log ("Enfant trouvé dans la hiérarchie !\n\n");
			children = this.transform.Find ("VISUEL").gameObject;
			Debug.Log (children + "\n\n");

		} else {
			Debug.Log ("Rien trouvé :( !\n\n");
		}
	}

	void Update()				//Désaffiche le nom du support sélectionné si l'explorateur est fermé.
	{
		if (explorateurFichier.activeSelf == false) {
			txtSupportActif.text = null;
		}
	}

	public void Texturing ()		//Fonction lancée depuis le Filebrowser : texture la surface trouvée dans le OnMouseDown.
	{
		string imageImportee = fileBrowser.FileName;						//on récupère le nom de fichier de la texture.
		Texture2D texture = (Texture2D)Resources.Load (imageImportee);		//on le charge en tant que texture.
	}
}


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

Re: [DB - AL] Scripter un import de texture sur un gameObject

Message par boubouk50 » 19 Jan 2018 16:09

Je ne comprends pas trop. OnMouseDown () lance la recherche de l'enfant nommé VISUEL, et le clic lance le FileBrowser. Mais la fonction Texturing est appelée par quoi? Normalement par le clic de validation d'un fichier depuis le FileBrowser, donc bien après le OnMouseDown (). Donc soit, children n'est pas affecté car pas trouvé, soit l'appel à Texturing () est mal situé donc se fait avant le OnMouseDown (), soit OnMouseDown () n'est pas appelé. (Ça peut encore être surement d'autres paramètres de configuration, mais ça on pas les infos).
Aussi ta fonction Texturing () n'affecte pas la texture2D à children...
"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] Scripter un import de texture sur un gameObject

Message par Kazuma17 » 19 Jan 2018 16:33

Merci pour ta réponse,

c'est bien ça Texturing() est appelée par le Filebrowser, comme on peut le voir sur l'image qui suivra :

OnSubmit (donc lorsqu'on clique sur le bouton pour importer l'image) lance la fonction Texturing(). Si je dis que children ne fonctionne pas c'est parce que j'ai testé avec un "Debug.Log(children);" dans la fonction et la console me renvoie un Null. C'est dû au fait que ma variable children est définie dans la fonction OnMouseDown() non ? Mais je ne vois pas comment régler/contourner le problème. :|

FileName est l'endroit où vient s'écrire le nom du fichier importé.

Image


Oui pour l'instant Texturing() ne fait que stocker la texture, je n'ai pas avancer plus loin avant d'avoir ma variable sur laquelle la placer.

Voici mon code complet avec le Debug.Log(children); pour que tu puisses voir où je l'ai placé.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using uFileBrowser;

public class OnMouseDownScript : MonoBehaviour {

	public GameObject explorateurFichier;
	public FileBrowser fileBrowser;
	public Text txtSupportActif;
	GameObject children;


	public void OnMouseDown()		// Au clic sur gameObject : affiche le FileBrowser et le nom du support sélectionné et trouve la surface à texturer. 
	{
		explorateurFichier.SetActive (true);
		txtSupportActif.text = this.name;
		string support = this.gameObject.name;
	

		if (this.transform.Find ("VISUEL").gameObject) {
			Debug.Log ("Enfant trouvé dans la hiérarchie !\n\n");
			children = this.transform.Find ("VISUEL").gameObject;
			Debug.Log (children + "\n\n");

		} else {
			Debug.Log ("Rien trouvé :( !\n\n");
		}
	}

	void Update()				//Désaffiche le nom du support sélectionné si l'explorateur est fermé.
	{
		if (explorateurFichier.activeSelf == false) {
			txtSupportActif.text = null;
		}
	}

	public void Texturing ()		//Fonction lancée depuis le Filebrowser : texture la surface trouvée dans le OnMouseDown.
	{
		string imageImportee = fileBrowser.FileName;						//on récupère le nom de fichier de la texture.
		Texture2D texture = (Texture2D)Resources.Load (imageImportee);		//on le charge en tant que texture.
		Debug.Log(children);
	}
}

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

Re: [DB - AL] Scripter un import de texture sur un gameObject

Message par boubouk50 » 19 Jan 2018 17:25

children est déclaré dans le scope de la classe donc est accessible.
Le problème je pense est inverse. Ton événement OnSubmit () ne peut déclencher qu'une seule instance de ton script, donc Texturing () n'est appelé que pour un seul objet, celui que tu as placé dans le champ du OnSubmit (). De ce fait, il te faudrait plutôt créer un Manager qui va faire le lien.
Il va donc falloir penser ton script différemment. Finis les this. Il faudra que cela aille pointer sur l'objet sélectionné.
Tes objets sélectionnables devront avoir un simple script qui va envoyer au Manager les infos nécessaires au moment du clic: lui-même (GameObject) ou juste son nom et l'enfant (GameObject) qu'il aura préalablement trouvé au Start().
le Manager, lui ne fait pas grand chose en soi, il centralise, donc il affichera/masquera l'explorateur et remplira le texte support. Sa fonction Texturing () sera appelée par OnSubmit () pour opérer les changements.
"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] Scripter un import de texture sur un gameObject

Message par Kazuma17 » 22 Jan 2018 12:54

Aaaaa très bien c'est vrai qu'il ne pouvait pas avoir accès à children de cette manière, je n'avais pas pris le problème sous le bon angle !

Merci pour ton aide j'y vois plus clair mais pourrais-tu m'aiguiller encore un peu plus sur le Manager, j'ai du mal à trouver des infos sur ça. Je n'arrive pas à voir comment enregistrer les infos de clic sans un this, puis comment les envoyer au Manager ?.. :?

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

Re: [DB - AL] Scripter un import de texture sur un gameObject

Message par boubouk50 » 22 Jan 2018 14:19

Euh... Je ne suis pas sur que tu aies bien tout saisi sur le fonctionnement de la POO, donc pas facile de te répondre, ma réponse précédente était plutôt claire... Le Manager n'est qu'un nom donné, c'est une façon de procéder pour centraliser les informations. Il va posséder des données et des fonctions publiques accessibles par d'autres scripts que ceux-ci vont affecter et appeler. Ensuite, le Manager va s'occuper de récupérer l'image externe pour l'affecter.
"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] Scripter un import de texture sur un gameObject

Message par Kazuma17 » 24 Jan 2018 16:40

Salut !

Je bloque, ça devient certainement trop avancé pour moi l'histoire des managers ou il y a quelque chose qui m'échappe. Je pense avoir trouvé un moyen de contourner le manager (ou pas) en récupérant les infos sur l'UI.Text qui affiche le nom du support. Ainsi en prenant ce nom affiché on peut le retrouver dans la hiérarchie, et de là on retrouve les enfants qu'on vient texturer ?

Voici mes deux scripts, si ma manière de procéder est bonne je devrais pouvoir supprimer la fonction Awake() du script Infos par la suite, elle n'est pas utile :

INFOS SCRIPT - appliqué à tous mes objets devant être texturés

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using uFileBrowser;   // autorise le type FileBrowser

public class InfosScript : MonoBehaviour {

	public GameObject explorateurFichier;
	public GameObject ManagerScript;
	public Text txtSupportActif;
	string support;
	GameObject children;

	public void Awake()
		{
		support = transform.name;								//stocke le nom du support dans la variable support
		Debug.Log ("Info : Affichage est :"+ support +"\n\n");
		children = transform.Find ("Mesh54").gameObject;		//stocke l'enfant à localiser dans une variable children
		Debug.Log ("Info : L'enfant est :" + children + "\n\n");
		}

	public void OnMouseDown()			//au clic sur le support
	{
		explorateurFichier.SetActive (true);		//explorateur de fichier s'ouvre
		txtSupportActif.text = support;				//l'UI Text affiche le nom du support sur lequel on a cliqués
	}
}
MANAGER TEXTURING SCRIPT - unique, dont la fonction Texturing() sera associé au clic sur le bouton d'import de l'explorateur de fichier.

Code : Tout sélectionner

	using System.Collections.Generic;
	using UnityEngine;
	using uFileBrowser;
	using UnityEngine.UI;

	public class ManagerTexturingScript : MonoBehaviour {

		public GameObject explorateurFichier;
		public FileBrowser fileBrowser;
		public Text txtSupportActif;
		string support;
		GameObject children;

		public void Texturing ()
		{
		support = txtSupportActif.text;										//récupération du support sélectionné grace a l'UI Text
		Debug.Log ("Manager : Affichage est :"+ support +"\n\n");

			
		//Instruction à insérer - on récupère l'enfant du support dans une variable nommée children
		Debug.Log ("Manager : L'enfant est :" + children + "\n\n");

		string imageImportee = fileBrowser.FileName;						//on récupère le nom de fichier de la texture
		Texture2D texture = (Texture2D)Resources.Load (imageImportee);		//on le charge en tant que texture
		Debug.Log (imageImportee);											
		children.GetComponent<Renderer>().material.mainTexture = texture;	//on remplace l'ancienne texture par l'image importée en texture
		}

		void Update()															//Désaffiche le nom du support sélectionné si l'explorateur est fermé
		{
			if (explorateurFichier.activeSelf == false)
			{
				txtSupportActif.text = null;
			}
		}
	}
Mon problème se trouve dans le script MANAGER à la ligne 21. Je n'arrive pas à rechercher dans ma scène le GameObject correspondant au string enregistré dans la variable support. :pleur4:

Voici l'affichage console :

Image

"Manager - l'enfant est :" n'affiche rien puisque je n'ai pas encore insérer mon instruction de recherche.
"fond blanc.jpg" est mon image de test pour l'import donc on voit qu'elle est bien importée.
Puis ligne 27 j'ai une nouvelle erreur par rapport à l'application de la texture...

Répondre

Revenir vers « (C#) CSharp »