[RESOLU][DB-AL] AddListener: Ajouter une action OnClick () depuis le code

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
Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par Badfly » 05 Nov 2017 18:19

Voilà la classe Window :

Code : Tout sélectionner

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

public class Window : MonoBehaviour {

	public string name;
	public GameObject newWindow;
	public GameObject close_button;


	public Window()
    {
		
 	}

	public GameObject open()
    {				
		/*
			1.On instancie la nouvelle fenêtre.
			2.On recherche le canvas sur la scène.		
			3.On place la fênêtre en enfant du canvas.
			4.On place la fênetre au centre du canvas.
		*/
       	newWindow = Instantiate(Resources.Load("Prefab/Repaire/Window_" + name, typeof(GameObject))) as GameObject;

		newWindow.name = "Window_" + name;
		GameObject canvas = GameObject.Find ("Canvas_Repaire");

		newWindow.transform.parent = canvas.transform;
		newWindow.GetComponent<RectTransform> ().anchoredPosition = new Vector2 (0, 0);

		close_button = newWindow.transform.Find ("fenetre-fond/top-window/close-btn").gameObject;
		Debug.Log (close_button.name);

		close_button.GetComponent<Button> ().onClick.AddListener(() => close());

        return newWindow;
    }

    public void close()
	{
		Debug.Log ("Test");
		Destroy (this);
	}
}
Quel autre code tu voudrais ?

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

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par boubouk50 » 06 Nov 2017 10:52

C'est bien ce code qu'il me faut. Par contre, si le bouton est bien le bon bouton trouvé (en existe-t-il plusieurs?), je ne vois pas pourquoi cela ne fonctionne pas.
D'après les sources sur le net, c'est bien la bonne syntaxe.
Par contre, c'est newWindow que tu veux détruire, non? pas this. Il te faut également supprimer le Listener une fois la fenêtre détruite. (voir lien source).
"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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par Badfly » 06 Nov 2017 17:44

Alors actuellement, sur cette fenêtre il n'y a que ce bouton (c'est pour cela que je met un chemin en dur, car nos fenêtres sont fait de telle sorte à ce que le bouton fermé par exemple ai toujours le même chemin) et quand je Debug.log le nom du bouton, il m'affiche bien celui qu'il faut.

Et en effet, j'ai oulbié de vous rajouter le Destroy(newWindow).
Pour supprimer le Listener, comme le bouton est supprimé du jeu à la fermeture de la fenêtre, est-ce utile ?

Après, j'ai peu être fais une erreur autre part. Comme tu l'as dis au niveau conception. Par exemple ce script là n'est posé nul part sur la scène. Je l'initialise juste depuis un autre script. Peu être que pour un bouton, la fonction doit se trouver OBLIGATOIREMENT sur la scène pour que le addListener fonctionne ? C'est une idée comme ça car c'est la seule que j'ai ...

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

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par boubouk50 » 06 Nov 2017 18:24

Ah bah oui un peu que le script doit être dans la scène sinon ce script n'existe pas et l'appel n'existe pas non plus...
"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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par Badfly » 07 Nov 2017 10:37

Ok, je vais essayer de mettre le script sur la scène. Mais une question du coup, le fait de faire un newWindow = new newWindow(); cela ne sert il pas justement à créer le script et de pouvoir appeler les fonctions à l'intérieur de cette dernière ? Car la fonction open(), codé dans le même script, je peux l'appeler. Même la fonction close() peu être appelé mais sans le bouton :(

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

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par boubouk50 » 07 Nov 2017 11:24

Je suis tout emmêlé avec toutes ces tentatives de maintenir un code qui ne va pas vraiment...
Ce script Window, est bien quelque part dans la scène pour l'appeler, non? Depuis un bouton ou autre?
La fonction close () ajouté au Listener est celle de ce script pas de newWindow.
Ta newWindow n'est qu'un gameObject dans ce script, rien de plus.
"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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par Badfly » 07 Nov 2017 11:42

Oui je me suis mal exprimé.

J'ai un premier script windowManager ce dernier va créer une classe appelée windowOne admettons. Ce script hérite de la classe Window. Donc dans le script windowManager pour créer une fenêtre je fais donc

Code : Tout sélectionner

windowOne maFenetre = new windowOne();
. Jusque là j'ai tout bon?

Une fois avoir initialisé la fenêtre je peux l'ouvrir avec maFenêtre.close() La fonction close() étant dans la classe Window. Quand je détruis la fenêtre je supprime le GameObject de la fenêtre et la classe maFenetre qui sera re-initialisé quand on veut ouvrir la fenêtre.

Donc les scripts des classes windowOne et Window ne sont pas sur la scène au début. Mais je les initialise dans le code. Mais j'ai peu être tout faux.

J'espère avoir été plus précis :)

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

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par boubouk50 » 07 Nov 2017 12:49

N'étant pas réellement sur de la réponse, je ne vais rien t'affirmer ni pouvoir t'expliquer. Si un vrai dev passe par là...

Je ne peux confirmer le fonctionnement du Listener du OnClick(). Je ne sais pas s'il prend en compte des objets qui ne sont pas des gameObjects présents dans la scène.

Comme, je te l'ai dit dès le départ, tout ceci n'aurait pas lieu si le bouton fermer était présent directement dans la fenêtre que tu instancies avec un script de fermeture de la fenêtre en cours. Après, je comprends l'idée d'un manager de fenêtre qui doit normalement tout gérer et ça me semble correcte comme approche. Mais, sans tester de mon côté (je n'ai pas le temps pour cela), je suis un peu bloqué par mes connaissances de développeur. :triste1:
"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

Badfly
Messages : 62
Inscription : 19 Mai 2017 14:46

Re: [DB-AL] Initialiser un bouton à la création d'une fenêtre

Message par Badfly » 07 Nov 2017 14:39

Je comprend. J'ai revu légèrement la conception. Mit le script maFenêtre sur la scène avec le manager et ça passe. C'était pas l'idée du début. Mais je suppose que le plus important c'est que ca fonctionne :)

Merci pour ton aide ! Sujet clos

Répondre

Revenir vers « (C#) CSharp »