'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);
}

我希望这能解决一些问题。