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中的常见方法