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

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

Message par Kazuma17 » 12 Jan 2018 17:06

Bonjour ! :-D

Je travaille depuis quelques mois pour ma boîte sur un projet de logiciel de mise en situation automatique, le principe est le suivant : le client ouvre le logiciel, il y trouve un lieu en 3D avec les différents supports, il importe un fichier image et ce visuel se place sur un des supports choisis au préalable.

J'arrive à la fin mais je bloque, et j'aurais besoin de votre aide pour le script de texturing du support. Etant débutant sur Unity j'ai appris au fur et à mesure de l'avancé du projet et ce bout de code manquant m'a l'air assez complexe... :cote:

Chacun des supports possède un Box Collider avec un script qui ouvre un explorateur de fichier au clic (trouvé sur l'asset Store, le U file browser). Cet explorateur de fichier permet de sélectionner l'image sur l'ordinateur qui servira de visuel au support. Une fois le fichier importé, une fonction se lance et c'est dans cette fonction que doit se trouver les lignes de code permettant de texturer le support avec l'image importée. Il ne me manque que ce bout de code pour terminer le projet.

On a donc un box collider sur chaque gameObject de support pour le clic ouvrant l'explorateur de fichier, et chaque partie qui doit être texturée porte le tag "VISUEL". Par exemple pour un cadre, la texture ne sera pas sur l'ensemble du gameObject, l'image n'étant qu'à l'intérieur du cadre et non sur sa moulure, d'où la raison du tag pour la partie à texturer.
Comme le script est apposé sur chaque support, on pourrait écrire quelque chose du type "this.FindWithTag"VISUEL";" pour ce qui est de l'endroit où la texture se pose. Pour la transformation de l'image en texture je bloque et je ne sais pas si c'est chose facile...

J'espère avoir été assez clair dans mes explications. Merci d'avance pour votre aide ! ;-)

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 » 12 Jan 2018 17:10

Tout simplement, il faut remplacer la texture du matériau du plan de l'objet sélectionné.
Par contre, ton image risque d'être déformée si elle n'a pas le même aspect ratio que ton plan.
Fais une recherche sur ce forum pour changer une texture d'un matériau au runtime, j'ai déjà répondu à cette question une bonne centaine de fois en 3 ans.
"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 » 12 Jan 2018 18:54

Salut et merci pour ta réponse,

J'ai bien saisi ce que je devais faire, je n'ai juste aucune idée de comment le coder. Je ne comprends pas comment dire au script de récupérer l'image pour en faire une texture... La plupart des topics parlent d'une image déjà présente dans les dossiers du projet (J'ai lu qu'il y avait un dossier Ressources, peut-être dois-je faire en sorte que l'image importée se stocke dedans ?). J'ai cherché sur le forum avec les mots-clés que tu as évoqué mais je n'ai rien trouvé qui résoud mon problème, ou alors je n'imagine pas les choses de la bonne manière.

Pour le format d'image je précise les différentes dimensions dans le logiciel pour que le client importe un visuel avec des proportions homothétiques.

Avatar de l’utilisateur
Max
Messages : 8765
Inscription : 30 Juil 2011 13:57
Contact :

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

Message par Max » 12 Jan 2018 18:59

Bonsoir,

Un sujet du forum qui devrait probablement t'aider: viewtopic.php?t=7836
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

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

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

Message par Kazuma17 » 15 Jan 2018 16:47

Salut Max, merci pour ton aide ! :-D

En effet ça pourra m'être utile, mais il faut préciser si d'autres viennent lire ce topic que le code est obsolète. Si je dis pas de connerie il faut remplacer

Code : Tout sélectionner

 renderer.material.mainTexture = www.texture;
par

Code : Tout sélectionner

GetComponent<Renderer>().material.mainTexture = www.texture;>
.

J'ai mis cet aspect là de côté pour le moment, j'aimerais me focaliser sur le fait d'appliquer la texture au bon endroit. Je voulais trouver un moyen de trouver à la fois les enfants dans la hiérarchie, puis ceux taggués "VISUEL". Finalement je n'ai pas l'impression que ce soit possible, donc j'ai détourné le problème en renommant les mesh à texturer plutôt qu'en les tagguant, ainsi je peux les trouver avec un

Code : Tout sélectionner

this.gameObject.transform.Find ("VISUEL")
.

Je rame, je rame, je rame... voici mon code actuel :

Code : Tout sélectionner

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

public class OnMouseDownScript : MonoBehaviour {

	public GameObject explorateurFichier;
	public Text txtSupportActif;


	void OnMouseDown()			// Au clic sur gameObject, active le FileBrowser et affiche le nom du support sélectionné.
	{
		explorateurFichier.SetActive (true);
		txtSupportActif.text = this.name;
	}

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

	public void Test () {			//Trouve le mesh à texturer dans la hiérarchie. Fonction lancée depuis le Filebrowser.
		
		if (this.gameObject.transform.Find ("VISUEL")) {
			Debug.Log ("Enfant trouvé dans la hiérarchie !");
		} else {
			Debug.Log ("Rien trouvé :( !");
		}
	}
}
Quand je clique sur mon objet l'explorateur de fichier s'ouvre. Un UI.Text affiche à l'écran le nom de l'objet qui a ouvert l'explorateur de fichier. Il faudrait que je puisse récupérer cette information à la place du "this" de la fonction Test(), car cette fonction est appelée par mon explorateur de fichier lorsque je clique sur le bouton d'import, ce qui fait qu'il cherche dans les enfants de l'explorateur de fichier plutôt que dans ceux de mon support... mais je ne vois pas comment faire :|

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 » 15 Jan 2018 17:10

Là, pour le coup, c'est ton script d'explorateur qui va te donner cela. Normalement lorsque tu sélectionnes un fichier, ce script doit créer un événement avec quelque chose, peut-être le chemin de la variable. C'est cette information qui est importante. Si ton asset est payant, tu ne peux pas mettre son code ici, il te faudra donc trouver le code lié au fichier choisi.
"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 » 15 Jan 2018 18:34

Oh.. je redoutais de devoir fouiller dans le code de l'explorateur... 8|

Il n'y a donc aucun moyen de remplacer le "this" par une variable générique ? J'avais pensé à quelque chose du style :

Code : Tout sélectionner

void Start()
{ support = txtSupportActif.text}

public void Test(){
	if (support.gameObject.transform.Find ("VISUEL")) { ... 
Bon bien sûr là ça ne risque pas de fonctionner puisque je récupère un texte, mais dans l'idée ? avec un .name ?

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 » 15 Jan 2018 18:39

Tu peux bien déclarer une variable si tu veux mais quoiqu'il arrive il faudra bien qu'elle pointe sur un objet. Le connais-tu cet objet qui contient le nom ou le chemin de ce que tu veux?
"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 » 18 Jan 2018 15:53

Je pense avoir trouvé ! je cherchais dans le code puis je me suis dit que dans l'Inspector on devrait voir la variable pour pouvoir la réutiliser, et tout simplement il y avait un "Filename". En testant lorsque j'importe le visuel, le nom du fichier se met bien dans cette case de l'Inspector. :-D

J'ai aussi trouvé le moyen de sélectionner la bonne partie du support sur lequel on a cliqué, voici mon code actuel :

Code : Tout sélectionner

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

public class OnMouseDownScript : MonoBehaviour {

	public GameObject explorateurFichier;
	public Text txtSupportActif;


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

		if (this.transform.Find ("VISUEL").gameObject) {
			Debug.Log ("Enfant(s) trouvé(s) dans la hiérarchie !");
			GameObject children = this.transform.Find ("VISUEL").gameObject;
			Debug.Log (children);
		} else {
			Debug.Log ("Rien trouvé :( !");
		}
	}

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



	void Test () {			//Fonction lancée depuis le Filebrowser : texture la surface trouvée dans le OnMouseDown.
		

	}
}
Je continue de chercher comment le faire par moi-même et je reviens vers vous, si en attendant vous voyez des problèmes je suis preneur de toutes remarques ! ;-)

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

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

Message par Kazuma17 » 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 {

Répondre

Revenir vers « (C#) CSharp »