[RESOLU] Remise à zéro d'un timer ?

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Alexis.B
Messages : 31
Inscription : 17 Avr 2020 12:51

[RESOLU] Remise à zéro d'un timer ?

Message par Alexis.B » 06 Mai 2020 10:44

Bonjour,
Pour mon jeu le personnage est au ralenti pendant 2sec le temps de choisir sa nouvelle trajectoire, j'essaye donc de réaliser une jauge de temps afin de savoir le temps de ralenti restant.
J'ai réussi à faire la jauge et l'écoulement mais par contre je n'arrive pas à la remettre à zéro (quand le clic de la souris est relâché ou quand les 2sec sont passées)
J'ai essayé différentes solutions sans succès..

Voici mon programme actuel :

Code : Tout sélectionner

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

public class ProgressBar : MonoBehaviour
{
    public float timeAmt;
    public float time;
    public float reset;
    public bool isSlowMotion = false;
    public Image mask;
    public GameManager gm;

    // Start is called before the first frame update
    void Start()
    {
        timeAmt = gm.timeToDragg;
        time = timeAmt;
    }

    // Update is called once per frame
    void Update()
    {
        if(isSlowMotion)
        {
            time -= Time.deltaTime;
            mask.fillAmount = time / timeAmt;
            return;
        }
        if(!isSlowMotion)
        {
            Debug.Log("False");
            timeAmt = gm.timeToDragg;
            time = timeAmt;
            mask.fillAmount = 1;
        }        
    }
}



Je ne sais pas si les fonctions pour remettre le tout à zéro sont bonnes mais en tout cas je sais que la condition

Code : Tout sélectionner

if(!isSlowMotion)
n'est pas lue alors que dans l'inspector est est bien décochée au bon moment..

Je coince un peu, je n'arrive pas a trouver de solution ni a comprendre..
Merci d'avance pour votre aide ! :)
Dernière édition par Alexis.B le 07 Mai 2020 11:49, édité 1 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Remise à zéro d'un timer ?

Message par jmhoubre » 06 Mai 2020 12:03

Bonjour,
c'est normal que isSlowMotion ne change jamais de valeur ? Initialisé à false au Start, ce bool devrait passer à true quand le temps s'est écoulé non ?

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: Remise à zéro d'un timer ?

Message par EmileF » 06 Mai 2020 12:55

Salut,
Il y a quelque chose que je ne comprends pas dans ton histoire.
Tu dis que le if(!isSlowMotion) ne s'exécute pas alors que tu déclares la variable isSlowMotion à false.
Normalement c'est la seule condition qui doit être exécutée.
Comme elle est en public tu dois la modifier à true à partir d'un autre script ou à partir de l'inspector pour que la condition if(!isSlowMotion) s'exécute.
Mais à partir de là, rien ne la remet à false.

Tu devrais faire quelque chose dans ce genre là (Attention codé directement dans le message pas testé):

Code : Tout sélectionner

void Update()
    {
        if(isSlowMotion)
        {
            time -= Time.deltaTime;
            mask.fillAmount = time / timeAmt;
            if (time <= timeAmt)
            {
                timeAmt = gm.timeToDragg;
            	time = timeAmt;
            	mask.fillAmount = 1;
            	isSlowMotion = false;
            }  
        }
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
jmhoubre
Messages : 859
Inscription : 05 Oct 2019 22:05

Re: Remise à zéro d'un timer ?

Message par jmhoubre » 06 Mai 2020 13:31

Bonjour,

j'ai fait un petit test, cela fonctionne bien :

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.UI;

public class ProgressBar : MonoBehaviour {
    public float timeAmt = 10f;
    public float time;
    public float reset;
    public bool isSlowMotion = false;
    public Image mask;
    
    void Start () {
        time = timeAmt;
    }

    void Update () {
        if (isSlowMotion) {
            time -= Time.deltaTime;
            mask.fillAmount = time / timeAmt;
            
            // Partie ajoutée.
            if (time <= 0) {
                isSlowMotion = false;
            }
            
            return;
        }
        if (!isSlowMotion) {
            Debug.Log ("False");
            time = timeAmt;
            mask.fillAmount = 1;
        }
    }
}
Et effectivement, il faut déclencher cette barre en mettant isSlowMotion à true quelque part.

Alexis.B
Messages : 31
Inscription : 17 Avr 2020 12:51

Re: Remise à zéro d'un timer ?

Message par Alexis.B » 06 Mai 2020 13:42

Merci pour vos réponses, c'est vrai que je ne l'ai pas précisé mais la valeur de isSlowMotion change dans le script qui gère le ralenti (il passe à true quand le ralenti est actif et false quand le temps est écoulé ou que l'on relâche le clic)
J'ai mis au départ isSlowMotion = false pour avoir un visuel lors du test, mais il passe à true dès le lancement puisque la première action à effectuer est le lancement du personnage (donc un ralenti).
Depuis l'inspector je vois bien que isSlowMotion passe de true à false et inversement au bon moment mais je ne comprend pas pourquoi la conditions n'est pas lue.
Je devrai peut être essayer de modifier isSlowMotion depuis la condition comme le propose EmileF.

J'ai apporté des petites modifications pour que le timer ne s'affiche qu'à partir du premier lancé (lors du premier lancé le Rigidbody2D est désactivé donc pas besoin du ralenti)

ProgressBar :

Code : Tout sélectionner

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

public class ProgressBar : MonoBehaviour
{
    public GameObject ui;
    public float timeAmt;
    public float time;
    public float reset;
    public bool isSlowMotion = false;
    public bool isProgressBar = false;
    public Image mask;
    public GameManager gm;

    // Start is called before the first frame update
    void Start()
    {
        timeAmt = gm.timeToDragg;
        time = timeAmt;
        isProgressBar = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (isProgressBar && isSlowMotion)
        {
            ui.SetActive(true);
            time -= Time.deltaTime;
            mask.fillAmount = time / timeAmt;
        }

        else
        {
            ui.SetActive(false);
            Debug.Log("False");
            timeAmt = gm.timeToDragg;
            time = timeAmt;
            mask.fillAmount = 1;

        }     
    }
}
Et mon GameManager (je suis désolé avec les essais que je fais il est un peu brouillon) :

Code : Tout sélectionner

using System.Collections;
using UnityEngine;

public class GameManager : MonoBehaviour
{
	#region Singleton class: GameManager

	public static GameManager Instance;

	void Awake ()
	{
		if (Instance == null) {
			Instance = this;
		}
	}

	#endregion

	Camera cam;

	public Ball ball;
	public Trajectory trajectory;
	//public GameObject ui;
	public ProgressBar progressBar;
	public float slowDownFactor = 0.05f;
	public float timeToDragg = 0.1f; //correspond à 2s avec le facteur de 0.05f
	public float timeDragging;
	[SerializeField] float pushForce = 4f;
	private float fixedDeltaTime;

	public bool isDragging = false;
	public bool isRespawn;
	public bool isMouseButtonDown;
	public bool isMouseButtonUp;
	public bool isInputEnabled = false;

	Vector2 startPoint;
	Vector2 endPoint;
	Vector2 direction;
	Vector2 force;
	float distance;

	//---------------------------------------
	void Start ()
	{
		cam = Camera.main;
		ball.DesactivateRb ();
		isRespawn = true;
	}

	void Update()
	{
		if (isInputEnabled)
		{
			if (Input.GetMouseButtonDown(0))
			{
				isDragging = true;
				timeDragging = 0;
				ActivatePuch();
				OnDragStart();
			}
			if ((Input.GetMouseButtonUp(0)) && (isRespawn == true))
			{
				progressBar.isSlowMotion = false;
				isDragging = false;
				OnDragEnd();

			}
			if (isDragging == true && timeDragging < timeToDragg)
			{
				progressBar.isSlowMotion = true;
				timeDragging += Time.deltaTime;
				OnDragSlow();				
			}
			if (isDragging == true && timeDragging >= timeToDragg)
			{
				progressBar.isSlowMotion = false;
				OnDrag();				
			}
		}
		
		this.fixedDeltaTime = Time.fixedDeltaTime;
	}

	
	//Drag
	void OnDragStart ()
	{
		startPoint = cam.ScreenToWorldPoint (Input.mousePosition);
		trajectory.Show();
		isMouseButtonUp = false;
	}

	void OnDragSlow()
	{
		Time.timeScale = slowDownFactor;
		Time.fixedDeltaTime = this.fixedDeltaTime * Time.timeScale;
		//ui.SetActive(true);
		endPoint = cam.ScreenToWorldPoint (Input.mousePosition);
		distance = Vector2.Distance (startPoint, endPoint);
		direction = (startPoint - endPoint).normalized;
		force = (direction * distance * pushForce);
		isMouseButtonDown = true;

		//just for debug
		Debug.DrawLine (startPoint, endPoint);
		trajectory.UpdateDots (ball.Pos, force);
	}

	void OnDrag()
	{
		Time.timeScale = 1f;
		Time.fixedDeltaTime = 0.001f * Time.timeScale;
		//ui.SetActive(false);
		endPoint = cam.ScreenToWorldPoint(Input.mousePosition);
		distance = Vector2.Distance(startPoint, endPoint);
		direction = (startPoint - endPoint).normalized;
		force = (direction * distance * pushForce);
		Debug.DrawLine(startPoint, endPoint);
		trajectory.UpdateDots(ball.Pos, force);
	}

	void OnDragEnd ()
	{
		//Propulser la Balle
		//ui.SetActive(false);
		ball.ActivateRb ();
		ball.ModifieRb ();
		Time.timeScale = 1f;
		Time.fixedDeltaTime = this.fixedDeltaTime * Time.timeScale;
		ball.Push (force);
		trajectory.Hide ();
		isMouseButtonDown = false;
		isMouseButtonUp = true;
		progressBar.isProgressBar = true;
	}
	public void DesactivatePuch()
	{
		isRespawn = false;
	}
	public void ActivatePuch()
	{
		isRespawn = true;
	}
}	

Alexis.B
Messages : 31
Inscription : 17 Avr 2020 12:51

Re: Remise à zéro d'un timer ?

Message par Alexis.B » 06 Mai 2020 15:34

J'ai trouvé quelque chose qui me plait un peu plus mais ce n'est pas encore ça..

Code : Tout sélectionner

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

public class ProgressBar : MonoBehaviour
{
    public GameObject ui;
    public float timeAmt;
    public float time;
    public float reset;
    public bool isProgressBar = false;
    public Image mask;
    public GameManager gm;

    // Start is called before the first frame update
    void Start()
    {
        timeAmt = gm.timeToDragg;
        time = timeAmt;
        isProgressBar = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (isProgressBar && gm.isDragging)
        {
            if (time > 0)
            {
                time -= Time.deltaTime;
                mask.fillAmount = time / timeAmt;
            }
        }
        if(gm.timeDragging >= timeAmt || !gm.isDragging)
        {
            ui.SetActive(false);
            Debug.Log("False");
            time = timeAmt;
            mask.fillAmount = 1;
        }
    }
}
Dans la condition "if(gm.timeDragging >= timeAmt || !gm.isDragging)", gm.timeDragging >= timeAmt fonctionne mais pas gm.isDragging alors que isDragging se désactive bien

Alexis.B
Messages : 31
Inscription : 17 Avr 2020 12:51

Re: Remise à zéro d'un timer ?

Message par Alexis.B » 07 Mai 2020 11:48

Problème résolu, j'ai fait exécuter la condition du relâchement du clic dans le GameManager et non dans la Condition du ProgressBar :)

Pour ceux que ça intéressent :
ProgressBar :

Code : Tout sélectionner

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

public class ProgressBar : MonoBehaviour
{
    public GameObject ui;
    public float timeAmt;
    public float time;
    public float reset;
    public Image mask;
    public GameManager gm;

    // Start is called before the first frame update
    void Start()
    {
        timeAmt = gm.timeToDragg;
        time = timeAmt;
    }

    // Update is called once per frame
    void Update()
    {
        if (gm.isDragging)
        {
            if (time > 0)
            {
                time -= Time.deltaTime;
                mask.fillAmount = time / timeAmt;
            }
        }
        if(gm.timeDragging >= timeAmt)
        {
            ResetProgressBar();
        }
    }
    public void ResetProgressBar()
    {
        ui.SetActive(false);
        Debug.Log("Drag out");
        time = timeAmt;
        mask.fillAmount = 1;
    }
}
GameManager :

Code : Tout sélectionner

using System.Collections;
using UnityEngine;

public class GameManager : MonoBehaviour
{
	#region Singleton class: GameManager

	public static GameManager Instance;

	void Awake ()
	{
		if (Instance == null) {
			Instance = this;
		}
	}

	#endregion

	Camera cam;

	public Ball ball;
	public Trajectory trajectory;
	public GameObject ui;
	public ProgressBar progressBar;
	public float slowDownFactor = 0.05f;
	public float timeToDragg = 0.1f; //correspond à 2s avec le facteur de 0.05f
	public float timeDragging;
	[SerializeField] float pushForce = 4f;
	private float fixedDeltaTime;
	public int x = 0;

	public bool isDragging;
	public bool isRespawn;
	public bool isMouseButtonDown;
	public bool isMouseButtonUp;
	public bool isInputEnabled = false;

	Vector2 startPoint;
	Vector2 endPoint;
	Vector2 direction;
	Vector2 force;
	float distance;

	//---------------------------------------
	void Start ()
	{
		cam = Camera.main;
		ball.DesactivateRb ();
		isRespawn = true;
	}

	void Update()
	{
		if (isInputEnabled)
		{
			if (Input.GetMouseButtonDown(0))
			{
				isDragging = true;
				timeDragging = 0;
				ActivatePuch();
				OnDragStart();
			}
			if ((Input.GetMouseButtonUp(0)) && (isRespawn == true))
			{
				isDragging = false;
				OnDragEnd();

			}
			if (isDragging == true && timeDragging < timeToDragg)
			{
				timeDragging += Time.deltaTime;
				OnDragSlow();

			}
			if (isDragging == true && timeDragging >= timeToDragg)
			{
				OnDrag();				
			}
		}
		
		this.fixedDeltaTime = Time.fixedDeltaTime;
	}

	
	//Drag
	void OnDragStart ()
	{
		startPoint = cam.ScreenToWorldPoint (Input.mousePosition);
		trajectory.Show();
		isMouseButtonUp = false;
		x += 1;
		if(x > 1)
		{
			ui.SetActive(true);
		}
	}

	void OnDragSlow()
	{
		Time.timeScale = slowDownFactor;
		Time.fixedDeltaTime = this.fixedDeltaTime * Time.timeScale;
		endPoint = cam.ScreenToWorldPoint (Input.mousePosition);
		distance = Vector2.Distance (startPoint, endPoint);
		direction = (startPoint - endPoint).normalized;
		force = (direction * distance * pushForce);
		isMouseButtonDown = true;

		//just for debug
		Debug.DrawLine (startPoint, endPoint);
		trajectory.UpdateDots (ball.Pos, force);
	}

	void OnDrag()
	{
		Time.timeScale = 1f;
		Time.fixedDeltaTime = 0.001f * Time.timeScale;
		endPoint = cam.ScreenToWorldPoint(Input.mousePosition);
		distance = Vector2.Distance(startPoint, endPoint);
		direction = (startPoint - endPoint).normalized;
		force = (direction * distance * pushForce);
		Debug.DrawLine(startPoint, endPoint);
		trajectory.UpdateDots(ball.Pos, force);
	}

	void OnDragEnd ()
	{
		//Propulser la Balle
		progressBar.ResetProgressBar();
		ball.ActivateRb ();
		ball.ModifieRb ();
		Time.timeScale = 1f;
		Time.fixedDeltaTime = this.fixedDeltaTime * Time.timeScale;
		ball.Push (force);
		trajectory.Hide ();
		isMouseButtonDown = false;
		isMouseButtonUp = true;
	}
	public void DesactivatePuch()
	{
		isRespawn = false;
	}
	public void ActivatePuch()
	{
		isRespawn = true;
	}
}	

Répondre

Revenir vers « Scripting »