【问题标题】:Reuse an already used scene in unity统一重用已经使用的场景
【发布时间】:2015-02-04 14:46:33
【问题描述】:

我有一个在游戏开始时打开的场景。让我们称这个场景为“开始”。它有一个新的游戏按钮,通过加载新场景来开始游戏。这个场景被称为“游戏”。游戏在“游戏”场景结束后,我想打开“开始”场景。

我为此使用 Application.LoadLevel("Start")。但是当再次打开“开始”场景时,所有游戏对象都被删除,除了我使用 DontDestroyOnLoad() 的那些。如果我在“开始”场景中暂停游戏,游戏对象会返回,但在检查器中分配的任何脚本中都为 null。

我不能对“开始”场景中的每个对象都使用 DontDestryOnLoad,因为它们对于“游戏”场景完全没用。

我也尝试过 Application.LoadLevelAdditive 但会给出与 DontDestroyOnLoad 相同的结果。

因此我想要的过渡是开始 -> 游戏 -> 开始 -> 游戏......

并且每次场景都可以从新的游戏对象开始或重用现有的游戏对象。但是在“游戏”场景中不需要“开始”中的对象,而在“开始”中只需要“游戏”场景的分数对象,我在其上应用了 DontDestroyOnLoad。该对象将在“开始”场景中的对象上写入分数。

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    在一个场景中创建的任何东西都将在您更改场景时被销毁,除非对象是 static 或您在该对象上调用 DontDestroyOnLoad()

    因此,从Start --> Game --> Start --> Game 出发没有任何副作用在逻辑上是正确的。但是,您必须避免重复创建对象,例如:

    Game 场景创建了一个Score 对象。

    public class Game : MonoBehaviour 
    {
         public GameObject score;
    
         void Awake()
         {
             score = GameObject.Find("Score");
    
             if(score == null)
             {
                 score = Instantiate(scorePrefab) as GameObject;
                 DontDestroyOnLoad(score);
             }
         }
    }
    

    代码确保下次您重新加载Game 场景时,不会有额外的Score 对象漂浮在周围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 2022-11-15
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多