如何理解这个C#/ Unity代码

时间:2018-03-14 00:40:29

标签: c# unity3d unityscript

我正在Unity 4.6.9中学习游戏开发。当我在我的游戏中添加背景音乐时,每当我点击 再次播放 按钮时,它就会堆叠。所以,我搜索并发现每次我再次点击播放时我必须销毁额外的音乐对象,所以我使用了以下代码: -

using UnityEngine;
using System.Collections;

public class MusicPlayer : MonoBehaviour {
static MusicPlayer instance=null;//DOUT

void Start () {
    if (instance != null) {
        Destroy (gameObject);
        print ("Duplicate music-player self destructing");
    } else {
        instance=this;//DOUT
        GameObject.DontDestroyOnLoad (gameObject);
    }
}
}

1。我无法理解第5行& 12.在第5行,我们正在创建实例变量,它是静态的&的值等于 MusicPlayer 类型的null,但在c#中没有这种数据类型。在第12行中 this 的含义是什么?

2。另外,我知道静态对象会被创建一次。因此,当我们开始游戏时,这个对象永远是不可破坏的。但是我们不能将正常的整数变量计数并将其值设置为0,如下所示:

int count = 0;
void Start () {
    if (count > 0) {
        Destroy(gameObject);
        print (“delete duplicate music player”);
    } else {
        count++;
        GameObject.DontDestroyOnLoad(gameObject);
    }
}

3 个答案:

答案 0 :(得分:1)

静态变量不仅仅被创建一次,它们也在类的所有实例之间共享。如果将其设为静态变量,则整数变量增量方法将正常工作,以便新MusicPlayer实例将看到先前创建的MusicPlayer已更新的值。

使用整数变量的方法和使用MusicPlayer变量的示例都实现了同样的目的。要创建的第一个MusicPlayer实例设置一些静态状态,这些静态状态对以后创建的任何实例都是可见的,让他们知道已经实例化了一个有效的MusicPlayer实例。

话虽如此,我个人认为使用最初设置为null的MusicPlayer变量可以更好地表示算法。

关于this的问题,它引用了这个类的实例。

MusicPlayer是类的名称,因此它只是对类实例的引用。

因此,您创建instance以保存指向MusicPlayer实例的指针。您将其初始化为null。然后,在创建第一个类实例时,将instance设置为指向刚使用this创建的新类实例。 MusicPlayer的未来实例会看到instance不是null并会自行销毁。

当然,这个课目前什么都不做,你仍然需要添加一个音频源或其他东西来实现播放音乐。

答案 1 :(得分:0)

1a上。您(或其他人)通过继承MonoBehavior来创建Type MusicPlayer。因此,它现在是一种可用于变量的类型。类中的包含变量(大多数语言支持此类或类似的东西)。

1b中。这是一种从实例函数中访问实例的方法。它主要用于解决类字段/属性和参数之间的任何歧义。但是它可以用来获得在

上进行furtehr调用的引用

2.实际上这个类必须实例化。没有永久存在的实例。除非我遗漏了某些内容,否则自动公共和无参数构造函数仍然存在。

还有一个静态变量,您也可以分配一个实例(并保持分配)。而静态变量恰好出现在类本身中。但就是这样。

这整个方法可以确保在某种程度上“只能有一个”音乐播放器。当然,一种简单的方法是停止当前播放MediaPlayer并开始新的音轨。 SingletonPattern可以用来确定只有一个实例,但是对于声音播放通常需要多个实例(旧游戏有16-32个频道的限制,但这一次很久了)。

答案 2 :(得分:0)

类本身是新数据类型的定义。使用MusicPlayer脚本创建新游戏对象时,会创建新的MusicPlayer对象,并运行Start()方法。此关键字替换为当前对象的referance(调用Start()方法),因此它只是将MusicPlayer类型的对象保存为静态varieable。并且更换referance,其中一个原始数据如bool或int将为我节省内存,但确保你不必在这个MusicPlayer上运行任何方法(如暂停或其他东西),因为只有这样做是通过保持这个referance ,如果你失去它,你将失去对这个对象的控制权。对象永远保存也是不正确的,有一个叫做垃圾收集器的东西,可以清除程序运行时的内存,如果它不再需要对象,它就会被删除。