[RESOLU] Problème avec les toggles (cases à cocher) ?

Questions à propos du GUI, y compris la partie script.
aclanto
Messages : 16
Inscription : 16 Août 2016 12:14

[RESOLU] Problème avec les toggles (cases à cocher) ?

Message par aclanto » 10 Nov 2016 21:44

Bonsoir tout le monde, :hello:

En août 2016, j'avais publié un sujet nommé "Comment utiliser les toggle (case à cocher) ?"
Voici le lien :
viewtopic.php?f=9&t=12951

Mon toggle se comportait comme un bouton. Sur la forme, mon problème a été résolu car mon toggle se comporte comme un toggle. Ayant d'autres obligations et pensant que tout fonctionnait bien, je ne me suis plus occupé de ce programme. Mais en le reprenant, hier, je me suis aperçu qu'il y avait quelque chose de non résolu dans mon programme concernant ce fameux toggle. ::d
Pour rappel, je suis entrain d'élaborer un "Space Invader Like" et mon toggle dois servir à activer ou désactiver le tire automatique de mon vaisseau voici les parties concernées de mon programme :

Les commandes du vaisseau :

Code : Tout sélectionner


using UnityEngine;
using System.Collections;

[System.Serializable]
public class Done_Boundary 
{
	public float xMin, xMax, zMin, zMax;
}

public class Done_PlayerController : MonoBehaviour
{
	public float speed;
	public float tilt;
	public Done_Boundary boundary;

	public GameObject shot;
	public Transform shotSpawn;
	public float fireRate;
    public int vie;
    public static bool t = false;

    private float nextFire;

    /*public float horizontalSpeed = 2.0F;
    public float verticalSpeed = 2.0F;*/

    void Update ()
    {
        if (Time.timeScale == 1)
        {
            if (((Input.GetButton("Fire1") || Input.GetKeyDown(KeyCode.Space) || t == true) && Time.time > nextFire))
            {
                nextFire = Time.time + fireRate;
                Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
                GetComponent<AudioSource>().Play();
            }
        }
	}

	void FixedUpdate ()
	{
		float moveHorizontal = Input.GetAxis ("Horizontal");
		float moveVertical = Input.GetAxis ("Vertical");

		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
		GetComponent<Rigidbody>().velocity = movement * speed;


        GetComponent<Rigidbody>().position = new Vector3
		(
			Mathf.Clamp (GetComponent<Rigidbody>().position.x, boundary.xMin, boundary.xMax), 
			0.0f, 
			Mathf.Clamp (GetComponent<Rigidbody>().position.z, boundary.zMin, boundary.zMax)
		);
		
		GetComponent<Rigidbody>().rotation = Quaternion.Euler (0.0f, 0.0f, GetComponent<Rigidbody>().velocity.x * -tilt);
	}
}

Le script du toggle que je mets dans le "On Value Change (Boolean)"

Code : Tout sélectionner


using UnityEngine;
using System.Collections;

public class Done_coche : MonoBehaviour
{
    

    public void tire(bool bt_value)
    {
        Done_PlayerController.t = bt_value;
    }
   

    }

Mon problème est que si active ou je désactive le toggle avec la case du "On Value Change (Boolean)" décoché, il ne se passe rien.
(Cette case apparait quand je met la fonction gérant le toggle dans le "On Value Change (Boolean)" je pense quelle doit gérer la variable booléen "bt_value". )

Si cette case du "On Value Change (Boolean)" est coché le tire automatique s'active dès lors que je coche ou décoche mon toggle et je ne peux plus désactiver le tire automatique. J'aimerais que quand je coche mon toggle le tire automatique s'active et qu'il se désactive quand mon toggle est décoché.

Pourriez-vous m'aidez à trouver une solution ?

Merci d'avance. :)

Très bonne soirée à tous et à toutes. :hello:

Bien cordialement,

aclanto
Dernière édition par aclanto le 25 Nov 2016 12:35, édité 4 fois.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Problème avec les toggles (cases à cocher) ?

Message par Moi 1971 » 11 Nov 2016 11:39

Bonjour,
j'ai malheureusement pas compris grand chose à ton problème de toggle... mais je vois que dans ton code tu utilises des "GetComponent<>" dans les Update et FixeUpdate. Ce n'est pas une bonne chose. Il faut mettre les "GetComponent<>" dans le Start avec des variables pour récupérer et conserver les "composents" et les utiliser dans les Update. Ça prend moins de temps processeur.
Pour ton problème de tir auto, j'ai pas compris ce que tu veux avoir comme fonctionnalité? Le joueur n'est pas obligé d'avoir le doigt sur le bouton tout le temps pour avoir le tir auto? Il suffit de cocher la case et ça tire tout le temps avec la même fréquence de tir? C'est ça?

aclanto
Messages : 16
Inscription : 16 Août 2016 12:14

Re: Problème avec les toggles (cases à cocher) ?

Message par aclanto » 11 Nov 2016 20:35

Bonsoir Moi 1971, :hello:

Merci pour ton message.

Oui, effectivement l'idée c'est cela même ; il suffirait de cocher la case et ça tirait tout le temps avec la même fréquence de tir et le joueur ne serait pas obligé d'appuyer sur le bouton tout le temps pour avoir un tire.

Je veux faire cela pour que si la personne a une tablette ou un Smartphone ce soit plus pratique pour elle, et si la personne a un ordinateur ou une console qu'elle puisse le gérer ses tires plus finement. Voilà pourquoi je veux donner le choix aux gens.

Je te remercie pour ton conseil à propos des "GetComponent<>". :)
J'en prend bien note, et je modifierai mon programme en conséquence.

Très bonne soirée. :hello:

Bien cordialement.

Aclanto

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Problème avec les toggles (cases à cocher) ?

Message par Moi 1971 » 12 Nov 2016 12:49

Maintenant, comment ta classe "Done_coche" accède-t'elle au booléen t de la classe "Done_PlayerController"? Où est le lien?
Pourquoi mettre en "static" le booléen "t" ?

Pour ma part dés que le script "Done_coche" pourra modifier le booléen "t" en fonction de l'état de la case à cocher, je ferais le code suivant dans le script (speudo code-code)

Code : Tout sélectionner

START () {
 BRUIT = GetComponent<AudioSource>();
}
UPDAT{
  IF (t) // Tir AUTO actif
  { 
    IF (TIME > NEXFIRE)
    {
        APPEL A LA FONCTION TIR()
    } // FIN IF (TIME > NEXFIRE) 
  }ELSE // Tir AUTO non actif
  {
    IF ((FIRE1 OU SPACE) ET TIME > NEXFIRE)
    {
        APPEL A LA FONCTION TIR()
    } // FIN IF ((FIRE1 OU SPACE) ET TIME > NEXFIRE)
  } //FIN IF(t) 
} // FIN UPDATE

FUNCTION TIR(){
{
                nextFire = Time.time + fireRate;
                Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
                BRUIT.Play();
            
}
Cette façon de faire empêche de tirer "à la main" quand le tir auto est enclenché.

aclanto
Messages : 16
Inscription : 16 Août 2016 12:14

Re: Problème avec les toggles (cases à cocher) ?

Message par aclanto » 14 Nov 2016 19:29

Cher Moi 1971, :hello:

Je te remercie pour ton dernier message et pour ton code.

"Done coche" accède aux booléen t car t est précéder de "Done_PlayerController." donc "Done coche" sait qu'il faut modifier t dans le fichier "Done_PlayerController" en fonction de la valeur du booléen "bt_value" qui devrait égale à "is On", un booléen d'Unity qui permet de détecter si le Toggle est coché ou non.

J'ai mis t en "static" pour que t puisse garder en mémoire l'état que utilisateur lui à donner en cochant ou décochant le toggle. Car il se pourrait que t change de valeur si par exemple le script "Done_PlayerController" se rechargé.

Je pense que mon problème est que justement je n'arrive pas à connecté "is On" à "bt_value" car je ne sais pas comment on récupère la valeur ce fameux "is On" d'Unity.
Donc en résumé je cherche à savoir comment "Done_coche" peut modifier le booléen "t" en fonction de l'état de la case à cocher(toggle). Pourrais-tu me montrer cela ? :)

Merci encore pour ton aide.

Très bonne soirée à toi. :hello:

Bien cordialement.

Aclanto

Molgy
Messages : 26
Inscription : 12 Mai 2016 04:01

Re: Problème avec les toggles (cases à cocher) ?

Message par Molgy » 21 Nov 2016 17:02

Hello,

Quand tu lies le script dans le champ "On Value Changed", est-ce que tu utilises bien ta méthode via une "dynamic bool" et non "Static Parameters"?

Dynamic bool va directement associé la valeur du toggle à ton paramètre de méthode, static parameters va te demander de lui fournir une valeur que tu mets à la main.

Cordialement,

Molgy
T'entraîner tu devras, :!:
Tester tu feras, :?:
Réussite tu auras. 8-)
-- Dayo ! :merci:

aclanto
Messages : 16
Inscription : 16 Août 2016 12:14

Re: Problème avec les toggles (cases à cocher) ?

Message par aclanto » 21 Nov 2016 20:36

Bonsoir Molgy, :hello:

Je te remercie vivement pour ta réponse, Molgy, car grâce à toi mon problème est presque résolu, je n'avais pas vu que quand on liait la fonction, "tire()" dans mon cas, que l'on pouvait soit la sélectionné dans "Static Parameters" ou soit dans "dynamic bool".

Depuis que je l'ai sélectionné dans "dynamic bool" cela fonction beaucoup mieux ! :super:
Cependant, si avant de lancer le jeu, je coche mon toggle par défaut en cochant "is On", le vaisseaux ne déclenche pas le tire automatique. Pour qu'il le déclenche, il faut que je mette le jeu en pause, que je décoche et recoche le toggle pour que tire automatique s'active. Donc dans ce cas, on peut dire que Unity manque le coche ! :hehe: C'est dommage sans ce bémol, la gestion du tire automatique fonctionnerait parfaitement bien.

Donc comment résoudre ce dernier petit problème ?

Molgy, je te remercie encore pour ton aide.

Bonne soirée. :hello:

Bien cordialement.

Aclanto.

Molgy
Messages : 26
Inscription : 12 Mai 2016 04:01

Re: Problème avec les toggles (cases à cocher) ?

Message par Molgy » 22 Nov 2016 10:53

Hello,

Aucun soucis, pour résoudre ton problème il suffit de set la value de Is_On à ta variable dans ta fonction start().

Ça doit donner quelque chose comme ça, si le script est bien attaché à ton toggle, sinon tu dois préciser quel objet contient le component toggle :

Code : Tout sélectionner

using UnityEngine.UI;

void Start()
{
	Done_PlayerController.t = GetComponent<Toggle>().isOn;
}

En gros là en lançant ton script tu set ta variable Done_PlayerController.t à la valeur actuelle de ton toggle, donc si décocher = false, si cocher = true

Cordialement,

Molgy
T'entraîner tu devras, :!:
Tester tu feras, :?:
Réussite tu auras. 8-)
-- Dayo ! :merci:

aclanto
Messages : 16
Inscription : 16 Août 2016 12:14

Re: Problème avec les toggles (cases à cocher) ?

Message par aclanto » 23 Nov 2016 22:49

Bonsoir Molgy, :hello:

Je te remercie pour ta réponse et pour ton script. :)

Mais, malheureusement, je n'arrive pas à faire fonctionner ton script.

Je pense que le problème est que Done_PlayerController.t ne prend pas la valeur de
GetComponent<Toggle>().isOn. Même si Done_PlayerController.t devrait normalement prendre cette valeur avec le "=" d'affectation.

Il se peut que le script n'a pas accès à GetComponent<Toggle>().isOn.
Qu'en pense-tu ?

Je te souhaite une bonne réception de ce message ainsi qu'une très bonne soirée.

Bien cordialement :hello:

Aclanto

P.S. : J'ai trouvé une astuce indépendamment de ton script : Au moment de déclarer Done_PlayerController.t donc la variable booléen "t" dans le fichier "Done_PlayerController.cs", on met cette dernière à "true" et on coche le
"Is On" d'Unity, le toggle fonctionne normalement. Mais cette astuce est limitée car on est obligé de proposer par défaut un vaisseau qui a le tire automatique puisque si "t" est à "false" le toggle bug au début. Et si on décoche le "Is On" d'Unity et qu'on déclare "t" à "false" on encore le même type de situation. Même si dans l'absolue on peut ce contenter de cette astuce, il serait quand même préférable au début de définir "t" en lui affectant la valeur du "Is On" d'Unity.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Problème avec les toggles (cases à cocher) ?

Message par Moi 1971 » 24 Nov 2016 12:09

Moi 1971 a écrit :Maintenant, comment ta classe "Done_coche" accède-t'elle au booléen t de la classe "Done_PlayerController"? Où est le lien?
Pourquoi mettre en "static" le booléen "t" ?

C'était le 12/11 !

Répondre

Revenir vers « L'interface GUI »