重新加载场景不会从另一个脚本加载变量的内容
本文关键字:加载 脚本 另一个 变量 新加载 | 更新日期: 2023-09-27 18:05:55
我需要帮助解决一个问题,我只是发现,而Unity3D脚本。
这是我的情况:
我有5张牌在桌子上。一张牌会加一分,而另外4张牌会夺去一条命。正确的卡片是随机选择的脚本附加到一个不同的对象出现在现场。
在我的第一张卡片中,我附上了这个脚本
public void SelectCard()
{
switch (externalVariable)
{
case 1:
UnityEngine.Debug.Log("You win a point!");
Application.LoadLevel("Mini Game 1");
break;
case 2:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Game 1");
break;
case 3:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Game 1");
break;
case 4:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Game 1");
break;
case 5:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Game 1");
break;
}
}
如你所见,如果随机数是1,玩家选择第一张牌将得1分,但如果随机数不同,玩家选择第一张牌,他将失去一条生命。
随机数存储在int变量中。为了访问它,我将它添加到附在第一张卡片
上的脚本的start()部分。externalVariable= externalObject.GetComponent<MiniGame1RightCard>().rightCard;
UnityEngine.Debug.Log("The right card is card number: " + externalVariable);
所以,第一张卡片将访问由外部脚本生成的随机数,该脚本附加到同一场景中的不同对象上,存储它,然后通过控制台输出告诉我哪一张是正确的卡片。然后,当玩家选中第一张牌时,脚本将比较存储在externalVariable中的随机数,以检查第一张牌是否真的是正确的牌。无论哪种方式,最后一步都是重新加载相同的场景以重新开始。
第一次加载场景时,一切都运行得很完美。我的问题始于第二次加载场景:externalVariable总是为零。现在,对于棘手的部分,如果我将相同的代码放在Update()部分而不是Start()部分,那么在一到两秒钟内,externalVariable将保持为零,然后更改为生成的随机数。
我的猜测是,当我重新加载场景重新开始时,我做错了什么,但我不知道是什么。
关于为什么代码第一次在Start()部分和每次在Update()部分工作良好的想法吗?
UPDATE UPDATE UPDATE UPDATE.
附加到card1的全部代码
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.IO;
using System;
using System.Threading;
public class Card1: MonoBehaviour
{
private string querySeleccionar = "SELECT Nivel FROM LevelAndDifficultyWHERE id=1;";
Text textoSilaba1;
public GameObject cardImage1;
public int level;
public int externalVariable;
public GameObject objetoExterno;
public void SeleccionarSilaba()
{
switch (externalVariable)
{
case 1:
UnityEngine.Debug.Log("You win a point!");
Application.LoadLevel("Mini Juego 1");
break;
case 2:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Juego 1");
break;
case 3:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Juego 1");
break;
case 4:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Juego 1");
break;
case 5:
UnityEngine.Debug.Log("You lose a life!!!");
Application.LoadLevel("Mini Juego 1");
break;
}
}
public void OnMouseDown()
{
}
// Use this for initialization
void Start ()
{
//lot of database stuff
switch (level)
{
case 1:
//lots of cases
}
externalVariable= externalObject.GetComponent<MiniGame1RightCard>().rightCard;
UnityEngine.Debug.Log("The right card is card number: " + externalVariable);
}
// Update is called once per frame
void Update ()
{
}
}
生成随机数的脚本
using UnityEngine;
using System.Collections;
public class MiniGame1RightCard: MonoBehaviour
{
public int rightCard;
// Use this for initialization
void Start ()
{
silabaCorrecta = UnityEngine.Random.Range(1, 5);
UnityEngine.Debug.Log("The right card is card number " + rightCard);
}
// Update is called once per frame
void Update ()
{
}
}
正如Neeraj已经提到的,你正在生成你的随机,并试图在相同的游戏周期(每次对象创建只运行一次)中获得它的值,Unity可以以任何顺序执行它们(在两者之间,任何可以先运行,所以如果Unity在你的随机生成器之前运行你的卡片脚本,它将无法工作,因为你还没有创建你的随机值)。
一个简单的解决方案是在Awake()方法而不是Start()中运行随机生成器逻辑。
另外,你可以看看一些好的编程实践,因为我看到你评论说,在你的条件开关中有很多情况,也许你可以正确地使用多态性应用更好的建模。(只要谷歌一下"为多态性改变开关"或类似的东西,然后研究一下)
这是unity中的一种预期行为,因为每当场景加载时,之前的游戏对象和脚本总是会被破坏并重新创建。如果你想保留生成随机数的脚本文件或游戏对象,你就必须将该类设置为持久类,这样它就不会在场景加载时被破坏。
是一个泛型持久类的例子使用UnityEngine;
//This is the parent class of all the singlton classes
public class Persistent<T> : MonoBehaviour
where T : Component
{
private static T instance;
public static T Instance {
get {
if (instance == null) {
instance = FindObjectOfType<T> ();
if (instance == null) {
GameObject obj = new GameObject ();
//obj.hideFlags = HideFlags.HideAndDontSave;
instance = obj.AddComponent<T> ();
}
}
return instance;
}
}
public virtual void Awake ()
{
//DontDestroyOnLoad (this.gameObject);
if (instance == null) {
instance = this as T;
} else {
Destroy (gameObject);
}
}
}
现在,如果你从这个类继承任何类,将不会在现场加载时销毁。这就是从这个类继承的方法。
public class MiniGame1RightCard : Persistent<MiniGame1RightCard>