Unity3d 团结的单身人士

Unity3d 团结的单身人士,unity3d,Unity3d,我想在切换场景时保留我的播放机,但不会获得太多副本,因此我发现了关于单打的情况。您可以这样做: public class Player : Monobehaviour { private static Player instance = null; void Start() { if (instance == null) { instance = this; DontDestroyOnL

我想在切换场景时保留我的播放机,但不会获得太多副本,因此我发现了关于单打的情况。您可以这样做:

public class Player : Monobehaviour
{
   private static Player instance = null;
   void Start()
       {
        if (instance == null)
          {
            instance = this;
            DontDestroyOnLoad(gameobject); 
          }
        else 
         Destroy(gameobject);
          
       }
}

这对我来说很难理解。我知道静态变量是如何工作的,它们属于类而不是实例。因此,首先我的对象在场景A中。我切换到场景B,将创建一个新的游戏对象,上面有脚本播放器。现在,由于实例持有对场景A中游戏对象的引用,为什么不调用else语句并实际创建一个新的gameobject?另外,如果您能比unitydoc更详细地解释DontDestroyOnLoad()的工作原理,我将不胜感激。

此代码在对象创建后运行。事实上,它运行在游戏对象的脚本上。else语句将运行,它将销毁此脚本附加到的游戏对象,这是您想要的,因为您在世界上已经有了以前的另一个副本(由“instance”变量引用的副本)。

JSchiff正确,此代码将在创建此对象的实例后运行,将当前实例存储在静态变量中,以便无条件访问“当前实例”,或者销毁已经存在的新实例。代码中的
else
分支将运行

要回答关于
DontDestroyOnLoad
及其与此静态变量的交互的扩展问题:
引擎中的所有对象都由
引擎保存在
内存中。
场景
可以被引擎视为“内存中对象的集合”。卸载场景时,该集合中的所有对象都将被销毁,除非引擎被告知
DontDestroyOnLoad
(在卸载中,尽管文档将其称为“交换”。您可以加载场景而不卸载场景,这可能是刚刚过时的术语,但这只是我的猜测)

这些思想结合在一起,使您的Singleton成为一个高度可访问的对象(在本例中是
静态的
实例变量)、持久的对象(通过
DontDestroyOnLoad
)、一种对象(通过销毁第一个对象之后的任何实例)。这不是应用Singleton模式的唯一方法,但它是Unity中的常见方法