2017-07-17 1 views
0

Très bien, j'ai un 'mini-jeu' qui ne fonctionne pas correctement. Fondamentalement, mon ClickedStartButton() ne fonctionne qu'à moitié. Si j'appuie sur play et appuie sur start, tout fonctionne parfaitement. Cependant, si je change de scène, retournez au menu principal et appuyez sur Lecture pour qu'elle cesse de fonctionner. Rien ne se passe du tout. Je ne comprends pas quelle partie de mon code causerait ce problème en raison du rechargement de la scène. Je sais que ClickedStartButton() est appelé, car isRolling = true; est appelé. Cependant, il semble que c'est la seule chose qui est appelée depuis la fonction après le rechargement d'une scène. Parce qu'au lieu de faire défiler mes pièces, rien ne se passe.La fonction Unity3D arrête de fonctionner après le changement de scène

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

public class chestScript : MonoBehaviour { 

    public float msToWait = 10800000.0f; // Wait time for Chest. 
    private const float ROLL_OFFSET = 650.0f; 
    public GameObject chestTimer; 
    private Button chestButton; 
    public Button startButton; 
    private Text chestTimerTxt; 
    public GameObject chestTimerBg; 
    private ulong lastChestOpen; 
    public GameObject newGift; 

    public Text coinTxt; 

    public Transform RollContainer; 
    private Transform[] rolls; 
    public GameObject rewardPanels; 

    private int coinAmt; 

    private bool isInitialized; 

    private bool isRolling; 
    private float transition; 
    private string giftName; 

    private int playerCoins; 

    private void Start() 
    { 
     isRolling = false; 
     InitializeGiftbox(); 
    } 
    private void InitializeGiftbox() 
    { 
     rewardPanels.SetActive (false); 

     coinAmt = 0; 

     chestButton = GetComponent<Button>(); 
     lastChestOpen = ulong.Parse(PlayerPrefs.GetString ("LastChestOpen")); 
     chestTimerTxt = GetComponentInChildren<Text>(); 
     rewardPanels.SetActive (false); 
     if (!IsChestReady()) { 
      startButton.interactable = false; 
      chestButton.interactable = false; 
      newGift.SetActive (false); 
      chestTimerBg.SetActive (true); 
      chestTimer.SetActive (true); 
     } 
     rolls = new Transform[RollContainer.childCount]; 
     for (int i = 0; i < RollContainer.childCount; i++) 
      rolls [i] = RollContainer.GetChild (i); 

     isInitialized = true; 
    } 
    private void Update() 
    { 
     if (!chestButton.IsInteractable()) 
     { 
      if (IsChestReady()) { 
       chestButton.interactable = true; 
       startButton.interactable = true; 
       chestTimer.SetActive (false); 
       chestTimerBg.SetActive (false); 
       newGift.SetActive (true); 
       return; 
      } 
      //Set Timer in h:m:s format 
      ulong diff = ((ulong)DateTime.Now.Ticks - lastChestOpen); 
      ulong m = diff/TimeSpan.TicksPerMillisecond; 
      float secondsLeft = (float)(msToWait - m)/1000.0f; 

      string r = " "; 
      //Hours 
      r += ((int)secondsLeft/3600).ToString("00") + " : "; 
      secondsLeft -= ((int)secondsLeft/3600) * 3600; 
      //Minutes 
      r += ((int)secondsLeft/60).ToString("00") + " : "; 
      //Seconds 
      r += ((int)secondsLeft % 60).ToString("00"); 
      chestTimerTxt.text = r; 

     } 
     if (isRolling) 
     { 
      Vector3 end = (-Vector3.right * ROLL_OFFSET) * (rolls.Length - 1); 
      RollContainer.transform.localPosition = Vector3.Lerp (Vector3.right * ROLL_OFFSET, end, transition); 
      transition += Time.deltaTime/5.0f; 
      if (transition > 1) 
      { 
       isRolling = false; 
       playerCoins = PlayerPrefs.GetInt ("coinAmount"); 
       chestButton.interactable = false; 
       startButton.interactable = false; 
       chestTimer.SetActive (true); 
       chestTimerBg.SetActive (true); 
       newGift.SetActive (false); 
       switch (giftName) 
       { 
       case "15Gold": 
        playerCoins += 15; 
        PlayerPrefs.SetInt ("coinAmount", playerCoins); 
        coinTxt.text = playerCoins.ToString(); 
        break; 
       case "5Gold": 
        playerCoins += 5; 
        PlayerPrefs.SetInt ("coinAmount", playerCoins); 
        coinTxt.text = playerCoins.ToString(); 
        break; 
       case "10Gold": 
        playerCoins += 10; 
        PlayerPrefs.SetInt ("coinAmount", playerCoins); 
        coinTxt.text = playerCoins.ToString(); 
        break; 
       case "1000Gold": 
        playerCoins += 1000; 
        PlayerPrefs.SetInt ("coinAmount", playerCoins); 
        coinTxt.text = playerCoins.ToString(); 
        break; 
       case "100Gold": 
        playerCoins += 100; 
        PlayerPrefs.SetInt ("coinAmount", playerCoins); 
        coinTxt.text = playerCoins.ToString(); 
        break; 
       case "40Gold": 
        playerCoins += 40; 
        PlayerPrefs.SetInt ("coinAmount", playerCoins); 
        coinTxt.text = playerCoins.ToString(); 
        break; 
       default: 
       case "Nothing": 
        Debug.Log ("Nothing happened"); 
        break; 
       } 
       PlayerPrefs.Save(); 
      } 
     } 
    } 
    public void ChestClick() 
    {  
     rewardPanels.SetActive (true); 
    } 
    private bool IsChestReady() 
    { 
     ulong diff = ((ulong)DateTime.Now.Ticks - lastChestOpen); 
     ulong m = diff/TimeSpan.TicksPerMillisecond; 
     float secondsLeft = (float)(msToWait - m)/1000.0f; 

     if (secondsLeft < 0) { 
      startButton.interactable = true; 
      chestButton.interactable = true; 
      chestTimer.SetActive (false); 
      chestTimer.SetActive (false); 
      newGift.SetActive (true); 
      return true; 
     } 
     return false; 
    } 
    public void ClickedStartButton() 
    { 
     lastChestOpen = (ulong)DateTime.Now.Ticks; 
     PlayerPrefs.SetString ("LastChestOpen", lastChestOpen.ToString()); 
     transition = 0; 
     float offset = 0.0f; 
     List<int> indexes = new List<int>(); 
     for (int i = 0; i < rolls.Length; i++) 
      indexes.Add (i); 

     for (int i = 0; i < rolls.Length; i++) { 
      int index = indexes [UnityEngine.Random.Range (0, indexes.Count)]; 
      indexes.Remove (index); 
      rolls [index].transform.localPosition = Vector3.right * offset; 
      offset += ROLL_OFFSET; 
      giftName = rolls [index].name; 
     } 
     isRolling = true; 
    } 
    public void ClickedCloseButton() 
    { 
     rewardPanels.SetActive (false); 
    } 
} 
+1

['DontDestroyOnLoad (Object)'] (https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html) ... –

Répondre

0

Je ne sais pas pourquoi, mais pour une Timescale raison est transférée sur entre les scènes dans l'unité en ajoutant des

Time.timeScale = 1; 

Il fixe mon problème, nous espérons que cela aidera les autres qui a les boutons quitter travailler sur des changements de scène. Correctif simple.

+0

Bien sûr, il "transfère entre les scènes". C'est une valeur * globale. * – Draco18s