UIBehaviour dérive de MonoBehaviour, donc cela ne devrait pas te poser de soucis.Kazuma17 a écrit : ↑18 Jan 2018 17:55Je 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 {
[DB - AL] Scripter un import de texture sur un gameObject
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
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
Re: [DB - AL] Scripter un import de texture sur un gameObject
Bonsoir,
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
Re: [DB - AL] Scripter un import de texture sur un gameObject
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).
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).
Re: [DB - AL] Scripter un import de texture sur un gameObject
Cool, merci pour votre intérêt à mon problème.
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é :
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.
}
}
- boubouk50
- 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
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...
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB - AL] Scripter un import de texture sur un gameObject
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é.
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é.
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é.
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);
}
}
- boubouk50
- 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
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB - AL] Scripter un import de texture sur un gameObject
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 ?..
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 ?..
- boubouk50
- 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
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB - AL] Scripter un import de texture sur un gameObject
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
MANAGER TEXTURING SCRIPT - unique, dont la fonction Texturing() sera associé au clic sur le bouton d'import de l'explorateur de fichier.
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.
Voici l'affichage console :
"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...
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
}
}
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;
}
}
}
Voici l'affichage console :
"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...