2017-07-17 3 views
0

In Ordnung, also habe ich ein 'Minigame', das nicht richtig funktioniert. Grundsätzlich funktioniert mein ClickedStartButton() nur halb. Wenn ich Play und Hit starte, funktioniert alles perfekt. Wenn ich jedoch Szenen ändere, dann gehe zurück zum Hauptmenü und drücke auf Play, es funktioniert nicht mehr. Nichts passiert überhaupt. Ich verstehe nicht, welcher Teil meines Codes dieses Problem verursacht, da die Szene neu geladen wird. Ich weiß, dass ClickedStartButton() aufgerufen wird, weil isRolling = true; wird genannt. Es scheint jedoch so zu sein, dass das einzige, was nach dem Laden einer Szene von der Funktion aufgerufen wird. Denn statt dass meine Münzen durchgescrollt werden passiert nichts.Unity3D Funktion beendet nach dem Szenenwechsel

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 (Objekt)'] (https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html) ... –

Antwort

0

Also ich bin nicht sicher, warum, aber aus irgendeinem Grund Zeitskala wird so zwischen den Szenen in Unity übertragen über durch Zugabe

Time.timeScale = 1; 

Es ist mein Problem behoben, hoffentlich wird dies anderen helfen, wer Tasten beenden Arbeiten an Szenenwechsel. Einfache Lösung.

+0

Nun natürlich "Transfers zwischen den Szenen." Es ist ein * globaler Wert. * – Draco18s

Verwandte Themen