【问题标题】:Loading a scene in Unity twice causes some game objects to lose some components在 Unity 中加载场景两次会导致某些游戏对象丢失某些组件
【发布时间】:2022-11-15 09:23:41
【问题描述】:

当我点击播放时,游戏场景表现正常,即使我来自不同的场景.

但是当我在游戏场景中并转到其他场景并再次返回游戏场景时,某些游戏对象的某些组件。

我正在使用 SceneManager.LoadScene("SceneName"); 在场景中移动,并且每个组件都添加到编辑器中并保存在场景中.

作为一个例子,这里是游戏管理器首次加载游戏场景时的检查员:

第二次加载游戏场景:

视窗控制是一个很像其他人失踪的脚本。

难道我做错了什么?

提前致谢。

【问题讨论】:

    标签: unity3d scene


    【解决方案1】:

    在不知道 GameManager 和 FoodManager 脚本内部发生了什么的情况下,我认为您使用的 DontDestroyOnLoad 类似于页面底部显示的内容,并且您的代码会破坏脚本。

    【讨论】:

    • 谢谢,当我用新的眼光更好地阅读我的代码时,我明白了发生了什么,确实是我的代码删除了组件。
    【解决方案2】:

    简而言之,我是短视的,我使用单例模式来访问管理器,而我所做的方式至少在这种情况下不起作用。

    我需要访问的任何管理器都创建了一个静态实例,但是由于我在其他地方检查了它的存在,所以第二次组件被销毁了。

    public GameManager Instance {get; private set;}
    
    void Awake()
    {
      if(Instance is not Null && Instance != this)
      {
        Destroy(Instance);
        return;
      }
      Instance = this;
    }
    

    我意识到每次场景加载组件都是新对象,但我仍然不明白为什么仍然有旧组件的副本。

    我通过在我可以使用的任何管理器引用上使用[SerializeField] 来修复它,并在检查器上手动添加它们,对于在运行时实例化的一些游戏对象,我将管理器传递给一个方法。

    GameManager gameManager;
    public void Manager(GameManager _gameManager)
    {
      gameManager = _gameMananger;
    }
    
    GameObject gameObject = Instantiate(prefab);
    gameObject.GetComponent<Script>().Manager(this);
    

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      相关资源
      最近更新 更多