Unity po zresetowaniu sceny nie działa metoda


#1

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

public class CharacterController2 : MonoBehaviour {

public float speed;
public float moveSpeed;
private bool isDead = false;
private Rigidbody2D rb2d;	
void Start ()
{
	
}
void Update (){
	if (isDead == false) {
		CheckUserInput ();


	}
}
void CheckUserInput () 
{
	if (Input.GetKeyDown (KeyCode.A)) {
		transform.position += new Vector3 (-1, 0, 0);
	}

	if (Input.GetKeyDown (KeyCode.D)) {
		transform.position += new Vector3 (1, 0, 0);
	}
	if (Input.GetKeyDown (KeyCode.W)) {
		transform.position += new Vector3 (0, 1, 0);
	}

	if (Input.GetKeyDown (KeyCode.S)) {
		transform.position += new Vector3 (0, -1, 0);
	}
	if (Mathf.Round(Time.time * 3) - speed == moveSpeed) {
		transform.position += new Vector3 (0, 1, 0);
		speed = Mathf.Round(Time.time * 3);
	
}

}

void OnCollisionEnter2D(Collision2D other)
{		
	isDead = true;
	GameManager.instance.BirdDied ();
}

}


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

public class GameManager : MonoBehaviour {
public static GameManager instance;
public bool gameOver = false;

// Use this for initialization
void Awake () {

	//If we don't currently have a game control...
	if (instance == null)
		//...set this one to be it...
		instance = this;
	//...otherwise...
	else if(instance != this)
		//...destroy this one because it is a duplicate.
		Destroy (gameObject);
	
}

// Update is called once per frame
void Update () {
	//If the game is over and the player has pressed some input...
	if (gameOver && Input.GetMouseButtonDown (0)) {
		//...reload the current scene.
		SceneManager.LoadScene(SceneManager.GetActiveScene ().buildIndex);
	}
}
	public void BirdDied()
	{
		
		gameOver = true;
	}
}

No i problem polega na tym że po zresetowaniu sceny nie działa
if (Mathf.Round(Time.time * 3) - speed == moveSpeed) {
transform.position += new Vector3 (0, 1, 0);
speed = Mathf.Round(Time.time * 3);
Nie ma żadnego komunikatu z błędem, po resecie sterowanie w tym skrypcie działa normalnie tylko czas przestaje istnieć.
Dołączam profesjonalnie nagrane video jak tan błąd wygląda w grze


#2

Zgaduje, że problemem jest dziwna logika korzystająca z Time.time, która zwraca czas w sekundach od startu gry. Po resecie sceny (zakładam, że chodzi o ponowne jej załadowanie), licznik nie zeruje się. Powinieneś raczej korzystać z Time.deltaTime, np.:
transform.position += Vector3.forward * Time.deltaTime * speedFactor;


#3

Rozwiązaniem było zmiana zmiennej na statyczną i czas działa jak trzeba ale teraz jest problem ze stanem śmierci który się nie resetuje ;/


#4

Singleton’y i zmienne statyczne to czyste zło :]
Który stan się nie resetuje? gameOver czy isDead? Dodaj troche Debuge.Log(text i stan) i posprawdzaj jakie mają stany w danej chwili.

Pamiętaj że reload scen nie resetuje zmiennych statcznych (nie wiem jak to jest z static class).
Ja przeważnie zresetuję zmienne w jakiejś funkcji na początku, czy to Awake() czy włąsnej Init() etc. Większa kontrola nad tym jakie wartości mają zmienne.


#5

“Singleton’y i zmienne statyczne to czyste zło :]”

Nie pisz głupot. Trzeba tylko rozważnie je używać. No w tym wypadku rzeczywiście singleton i ładowanie sceny jest bez sensu.

@MajorROB Zawsze pod ręką masz Debug.Logi, więc szybciej będzie Ci po prostu sprawdzić, które warunki nie działają lub które zmienne mają dziwne wartości aniżeli pytać się na forum.


#6

A tam od razu głupoty… utrata “modułowości”, brak kontroli, czytelności - no ale za to jak łatwo się to używa :smiley:

Ale nie o tym jest temat - jak ktoś będzie chiał to doczyta i samemu zdecyduje czy bedzię je używał.

@MajorROB - tak jak pisałem ja i Fen - posprawdzaj przy pomocy Debug.Log() co, gdzie i dla czego sie nie resetuje i będziesz miaał odpowiedz.


#7

Wszystko ogarnięte, dużo się nauczyłem przez ten problem wszystko działa jak należy.
Problem polegał na tym że nie było odpowiednich warunków po śmierci. Teraz po śmierci następuje pauza Time.timeScale = 0; a po reloadzie zmienia się na = 1.