[MY-AL] time.timeScale = 0 fait bugger Unity

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
qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

[MY-AL] time.timeScale = 0 fait bugger Unity

Message par qwerty31 » 01 Mars 2017 22:30

Bonjour à tous !

Je fais appel à vous car j'ai un problème qui me semble très simple mais que je n'arrive pas à résoudre. J'utilise pour détecter une chute un Collider2D trigger avec un script qui détecte un GameObject avec un tag "Player" et également un Collider2D trigger. Mon problème est que lorsque que la collision entre le détecteur et le player, Unity freeze complètement. Impossible de faire quoi que ce soit, je suis obligé à chaque fois de passer par le gestionnaire des tâches pour stopper Unity. Voici le code incriminé (très simple) :

Code : Tout sélectionner

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

public class DeathDetection : MonoBehaviour {

	void OnTriggerEnter2D(Collider2D col)
	{
		if (col.gameObject.tag == "Player") {
			Time.timeScale = 0;
		}
	}
}
Si vous avez une idée d'où ce problème peut venir, je vous écoute avec une attention rare ! :hehe:

Merci d'avance pour vos réponses
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

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

Re: [MY-AL] time.timeScale = 0 fait bugger Unity

Message par boubouk50 » 02 Mars 2017 11:06

https://docs.unity3d.com/ScriptReferenc ... Scale.html
When timeScale is set to zero the game is basically paused if all your functions are frame rate independent.
Lorsque le timescale est à 0, le jeu est en pause. Il n'y a plus d'Update. Il faut donc une programmation qui ne dépende pas du frameRate. C'est le comportement normal.
Après si tout freeze, ce n'est pas normal, effectivement. Mais là, je ne vois pas ce qu'on peut faire.
"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

qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

Re: [MY-AL] time.timeScale = 0 fait bugger Unity

Message par qwerty31 » 02 Mars 2017 16:55

C'est justement ça mon problème ! Mettre le jeu en pause c'est mon objectif, ce que je ne comprends absolument pas c'est pourquoi unity freeze...
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

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

Re: [MY-AL] time.timeScale = 0 fait bugger Unity

Message par boubouk50 » 02 Mars 2017 17:06

Je trouve pas trop d'infos là-dessus...
Certains mettent le timeScale à 0.00001f au lieu de 0.

As-tu un code qui te permette de remettre le timeScale à 1?
"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

qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

Re: [MY-AL] time.timeScale = 0 fait bugger Unity

Message par qwerty31 » 02 Mars 2017 19:50

En effet, c'est en cherchant dans les autres Time.timeScale de mes autres scripts j'ai réussi à résoudre mon bug, sans comprendre pourquoi ce beugue avait lieu. Ainsi, dans ce script :

Code : Tout sélectionner

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

public class TriangleInstanciate : MonoBehaviour {

	public GameObject triangle;
	private bool firstTime = true;
	private Vector3 gravity = new Vector3 (0, 0);
	private float gravityValue = 10.0f;
	private Color triangleColor = Color.blue ;
	private Vector3 trianglePosition = new Vector3 (0, 110, 1);
	private Quaternion triangleRotation = new Quaternion(0, 0, 0, 0);

	void Start () {
		Physics.gravity = gravity;
	}
	void Update () {
			if (firstTime) {
				firstTime = false;
				StartCoroutine (Instance ());
			}
			gravityValue += 0.1f;
			Physics.gravity = new Vector3 (0, gravityValue);
	}
	private IEnumerator Instance()
	{
		float waitValue = 2.0f;
		while(true)
		{
			if (Time.timeScale != 0) {
				triangleColor.b = Random.Range (0.1f, 1.0f);
				triangleColor.g = Random.Range (0.1f, 1.0f);
				triangleColor.r = Random.Range (0.1f, 1.0f);
				trianglePosition.x = Random.Range (7.0f, 54.0f);
				triangle.GetComponent<Image> ().color = triangleColor;
				Instantiate (triangle, trianglePosition, triangleRotation, GameObject.Find ("Canvas").transform);
				yield return new WaitForSecondsRealtime (waitValue);
				waitValue -= 0.05f;
				if (waitValue <= 0.5f) {
					waitValue = 0.5f;
				}
			}
		}
	}
}
c'est la condition dans ma coroutine avec Time.timeScale qui créait le freeze d'Unity. En enlevant cette condition, le jeu se met en pause comme prévu mais sans provoquer le freeze. Je n'ai aucune idée de pourquoi...?
Je suppose que ça a un lien avec la coroutine, car j'utilise exactement la même condition dans un autre script et celui-là ne provoque pas le freeze de unity :

Code : Tout sélectionner

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

public class TriangleDestroy : MonoBehaviour {

	public void Click()
	{
		if (Time.deltaTime != 0) {
			PlayerPrefs.SetInt ("score", PlayerPrefs.GetInt ("score") + 1);
			Destroy (gameObject);
		}
	}
}
Si tu as une idée de pourquoi ce beugue, je serai ravi d'en apprendre plus :cote:

En tout cas merci pour vos réponses.
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

Répondre

Revenir vers « (C#) CSharp »