'this' 是指 gameObject 还是 class 或 c# 脚本的名称?
Does 'this' refer to gameObject or class or the name of the c# script?
我试图了解如何为 Unity3D 实现 DontDestroyOnLoad,我看到了这篇文章:https://honkbarkstudios.com/developer-blog/dontdestroyonload-tutorial/
文章由 Christian Engvall 撰写,提供以下代码作为教程:
using UnityEngine;
using System.Collections;
public class MusicController : MonoBehaviour {
public static MusicController Instance;
void Awake()
{
this.InstantiateController();
}
private void InstantiateController() {
if(Instance == null)
{
Instance = this;
DontDestroyOnLoad(this);
}
else if(this != Instance) {
Destroy(this.gameObject);
}
}
}
更多信息:Engvall 创建了一个名为 MusicController 的游戏对象并为其附加了一个音频源。他还附上了一个 C# 脚本,也称为 MusicController。然后该脚本包含一个 public 类型的静态变量 MusicController,他将游戏对象拖入其中。代码的目标是让音频在场景中播放不减弱,即在加载新场景时不要破坏包含音频源的游戏对象。
我很困惑 'this' 是指 gameObject 还是 MusicController class。当我阅读 this.InstantiateController();
时,似乎 'this' 必须是 MusicController public class。但是,在下面
if(Instance == null)
{
Instance = this;
DontDestroyOnLoad(this);
}
else if(this != Instance) {
Destroy(this.gameObject);
}
似乎 'this' 必须引用链接到名为 Instance 的 MusicController public 静态变量的游戏对象。
所以我很困惑。是哪个?还是完全不同?
我曾尝试阅读 6 年前的这篇堆栈溢出 post,但不幸的是,我仍然感到困惑。
The 'this' keyword in Unity3D scripts (c# script, JavaScript)
预先感谢您的帮助。
这就像在说我自己。
在组件的unity脚本中,它指的是你所在的class实例。
您发布的代码是制作 MusicComponent 的简单单例。
this
总是引用 class 的实例。因此,在这种情况下,它是 MusicController
的实例。
this.gameObject
只是意味着您将获得附加到 MusicController
.
的 gameObject
Instance
是静态的,这意味着只有一个 "instance" 固定在内存中的某个位置。 MusicComponent
的每个实例都可以访问单个 "instance" 对象。因此,在您突出显示的方法中:
//I'm an instance of MusicComponent and I want to see if
//some other instance exists. If there's another music component already
//then Instance will NOT be null
if(Instance == null)
{
//Now I know I'm the only MusicComponent created so I'll set this static property to me
//This lets any new MusicComponents created know that there is already one alive
//and they should not stay alive
Instance = this;
DontDestroyOnLoad(this);
}
else if(this != Instance) {
//Turns out, I'm not the first instance of MusicComponent created because
//because another one has already set themselves to static property
//I know this but my pointer (this) isn't the same as the pointer set to the
//Instance static property
Destroy(this.gameObject);
}
我希望这能解决一些问题。
我试图了解如何为 Unity3D 实现 DontDestroyOnLoad,我看到了这篇文章:https://honkbarkstudios.com/developer-blog/dontdestroyonload-tutorial/
文章由 Christian Engvall 撰写,提供以下代码作为教程:
using UnityEngine;
using System.Collections;
public class MusicController : MonoBehaviour {
public static MusicController Instance;
void Awake()
{
this.InstantiateController();
}
private void InstantiateController() {
if(Instance == null)
{
Instance = this;
DontDestroyOnLoad(this);
}
else if(this != Instance) {
Destroy(this.gameObject);
}
}
}
更多信息:Engvall 创建了一个名为 MusicController 的游戏对象并为其附加了一个音频源。他还附上了一个 C# 脚本,也称为 MusicController。然后该脚本包含一个 public 类型的静态变量 MusicController,他将游戏对象拖入其中。代码的目标是让音频在场景中播放不减弱,即在加载新场景时不要破坏包含音频源的游戏对象。
我很困惑 'this' 是指 gameObject 还是 MusicController class。当我阅读 this.InstantiateController();
时,似乎 'this' 必须是 MusicController public class。但是,在下面
if(Instance == null)
{
Instance = this;
DontDestroyOnLoad(this);
}
else if(this != Instance) {
Destroy(this.gameObject);
}
似乎 'this' 必须引用链接到名为 Instance 的 MusicController public 静态变量的游戏对象。
所以我很困惑。是哪个?还是完全不同?
我曾尝试阅读 6 年前的这篇堆栈溢出 post,但不幸的是,我仍然感到困惑。 The 'this' keyword in Unity3D scripts (c# script, JavaScript)
预先感谢您的帮助。
这就像在说我自己。
在组件的unity脚本中,它指的是你所在的class实例。
您发布的代码是制作 MusicComponent 的简单单例。
this
总是引用 class 的实例。因此,在这种情况下,它是 MusicController
的实例。
this.gameObject
只是意味着您将获得附加到 MusicController
.
gameObject
Instance
是静态的,这意味着只有一个 "instance" 固定在内存中的某个位置。 MusicComponent
的每个实例都可以访问单个 "instance" 对象。因此,在您突出显示的方法中:
//I'm an instance of MusicComponent and I want to see if
//some other instance exists. If there's another music component already
//then Instance will NOT be null
if(Instance == null)
{
//Now I know I'm the only MusicComponent created so I'll set this static property to me
//This lets any new MusicComponents created know that there is already one alive
//and they should not stay alive
Instance = this;
DontDestroyOnLoad(this);
}
else if(this != Instance) {
//Turns out, I'm not the first instance of MusicComponent created because
//because another one has already set themselves to static property
//I know this but my pointer (this) isn't the same as the pointer set to the
//Instance static property
Destroy(this.gameObject);
}
我希望这能解决一些问题。