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