重新加载场景不会从另一个脚本加载变量的内容

本文关键字:加载 脚本 另一个 变量 新加载 | 更新日期: 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>