[RESOLU][DB-AL] Activer/Désactiver un message pendant 5 secondes

Questions à propos du GUI, y compris la partie script.
LOr1
Messages : 2
Inscription : 24 Avr 2020 08:19

[RESOLU][DB-AL] Activer/Désactiver un message pendant 5 secondes

Message par LOr1 » 24 Avr 2020 09:44

Bonjour,

Je suis actuellement en dernière année de mon cursus scolaire et suis en Travail de Fin d'Etude dont le but est de faire de la réalité virtuelle. Ne connaissant pas du tout le logiciel Unity, j'essaie dans un premier temps d'être à l'aise avec le logiciel tout en essayant de prendre les éléments pouvant être utilises pour mon sujet.

Dans mon travail, je veux afficher un message pendant 5 secondes et le faire disparaître. Je suis partie d'un script d'un cours de Unity que j'ai modifié pour le faire. J'arrive donc à l'afficher mais dès lors que j’ajoute un élément pour l'afficher 5 secondes, le message ne s'affiche plus et je n'arrive pas à comprendre pourquoi... J'ai essayé de voir si le programme accédait bien à ma boucle TempsMessage et la réponse est oui.

J'ai essayé de deux manières différentes, voici les deux scripts:

(1)UI - Text :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine;
using UnityEngine.UI;

public class Win5 : MonoBehaviour
{
    private Rigidbody Rb;

    public float Speed;

    private int Count;

    public Text CountText;

    public Text WinText;

    private float seconde;
    private void Start()
    {
        Rb = GetComponent<Rigidbody>();
        Count = 0;
        CountText.text = "Count : " + Count.ToString();
        WinText.text = "";
        seconde = 0;
    }
    private void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        Rb.AddForce(movement * Speed);

    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            Count += 1;
            SetCountText();
        }


    }
    void SetCountText()
    {
        CountText.text = "Count : " + Count.ToString();
        if (Count >= 12)
        {
            WinText.text = "You Win !!";
            print("avant temps message");
            TempsMessage();
        }
    }

    void TempsMessage()
    {
        print("entrée dans temps message");
        while (seconde <= 5)
        {
            seconde += Time.deltaTime*1f;
            print(seconde);
        }
        WinText.text = "";
    }

}
(2) GameObject :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine;
using UnityEngine.UI;

public class Win5 : MonoBehaviour
{
    private Rigidbody Rb;

    public float Speed;

    private int Count;

    public Text CountText;

    public GameObject WinText;

    private float seconde;
    private void Start()
    {
        Rb = GetComponent<Rigidbody>();
        Count = 0;
        CountText.text = "Count : " + Count.ToString();
        WinText.SetActive(false);
        seconde = 0;
    }
    private void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        Rb.AddForce(movement * Speed);

    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            Count += 1;
            SetCountText();
        }


    }
    void SetCountText()
    {
        CountText.text = "Count : " + Count.ToString();
        if (Count >= 12)
        {
            WinText.SetActive(true);
            print("avant temps message");
            TempsMessage();
        }
    }

    void TempsMessage()
    {
        print("entrée dans temps message");
        while (seconde <= 5)
        {
            seconde += Time.deltaTime*1f;
            print(seconde);
        }
        WinText.SetActive(false);
    }

}
Voilà, je ne sais pas si j'ai fait une erreur "grossière" ou si c'est juste pas possible !
Si vous avez la moindre aide pour essayer de résoudre mon problème, n'hésitez pas ! (Même une autre manière pour le faire :) ).

Merci,
LOr1
Dernière édition par LOr1 le 24 Avr 2020 11:28, édité 1 fois.

Avatar de l’utilisateur
Aelhan
Messages : 124
Inscription : 11 Déc 2019 23:00

Re: [DB-AL] Activer/Désactiver un message pendant 5 secondes

Message par Aelhan » 24 Avr 2020 10:56

Bonjour,

En général, c'est assez délicat (voire impossible mais je ne serais pas catégorique là-dessus) de travailler sur Time.deltaTime hors de fonctions de la famille de Update().
Je te suggère plutôt de passer par une coroutine et d'utiliser WaitForSeconds(5f), ça me semble beaucoup plus simple pour l'application que tu en as (voir : https://docs.unity3d.com/ScriptReference/Coroutine.html)
Celui qui pose une question risque cinq minutes d'avoir l'air bête.
Celui qui ne pose pas de question restera bête toute sa vie.

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

Re: [DB-AL] Activer/Désactiver un message pendant 5 secondes

Message par boubouk50 » 24 Avr 2020 11:05

Salut,

Vous êtes 5 cette semaine, avec plus ou moins la même question... Je crois que j'aide la classe entière :lol:

Tu ne peux pas boucler sur toi même comme ça, sans inclure la notion de temps dedans. Ici, la boucle s'exécute jusqu'à la fin dans la même frame, du coup le message apparaît et disparaît dans la même frame. Il faut donc attendre que la frame se termine avant de continuer dans ta boucle. Et cela tu ne peux pas le faire tel quel, il te faut passer par une coroutine.
L'exemple te donne exactement 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

LOr1
Messages : 2
Inscription : 24 Avr 2020 08:19

Re: [DB-AL] Activer/Désactiver un message pendant 5 secondes

Message par LOr1 » 24 Avr 2020 11:22

Merci Aelhan et boubouk50 pour vos retours.

En effet, ça a marché, merci pour vos conseils !

Je vous joins le script si jamais ça peut aider quelqu'un d'autre :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using Unity.Collections.LowLevel.Unsafe;
using UnityEngine;
using UnityEngine.UI;

public class Win5 : MonoBehaviour
{
    private Rigidbody Rb;

    public float Speed;

    private int Count;

    public Text CountText;

    public Text WinText;

    //private float seconde;
    private void Start()
    {
        Rb = GetComponent<Rigidbody>();
        Count = 0;
        CountText.text = "Count : " + Count.ToString();
        WinText.text = "";
        //seconde = 0;
    }
    private void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        Rb.AddForce(movement * Speed);

    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            Count += 1;
            SetCountText();
        }


    }
    void SetCountText()
    {
        CountText.text = "Count : " + Count.ToString();
        if (Count >= 12)
        {
            WinText.text = "You Win !!";
            print("avant temps message");
            StartCoroutine(TempsMessage());
        }
    }

    IEnumerator TempsMessage()
    {
        print("entrée dans temps message");
        Debug.Log("Started Coroutine at timestamp : " + Time.time);
        yield return new WaitForSeconds(5);
        Debug.Log("Finished Coroutine at timestamp : " + Time.time);
        WinText.text = "";
    }

}
Encore merci Aelhan et boubouk50

Répondre

Revenir vers « L'interface GUI »