[英]Unity3D Function quits working after scene change
好吧,所以我有一个“迷你游戏”无法正常工作。 基本上,我的ClickedStartButton()只能工作一半。 如果我按播放并按一下开始,则一切正常。 但是,如果我更改场景,则返回主菜单并单击播放,它将停止工作。 什么都没发生。 我不了解由于重新加载了场景,代码的哪一部分会导致此问题。 我知道ClickedStartButton()正在被调用,因为isRolling = true; 叫做。 但是,似乎这是在场景重新加载后从函数中唯一调用的东西。 因为没有发生任何事情,而不是滚动我的硬币。
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);
}
}
所以我不确定为什么,但是由于某种原因,Timescale在Unity中的场景之间转移
Time.timeScale = 1;
它解决了我的问题,希望这将有助于其他在场景更改时退出按钮的人。 简单修复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.