我正在学习统一4.6.9的游戏开发。当我把背景音乐添加到我的游戏中时,每当我点击play再一次按钮,它就会堆叠起来。因此,我搜索并发现,每当我再次单击“播放”时,我都必须销毁创建额外的音乐对象,所以我使用了以下代码:-
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. I无法理解第5行和第12行。在第5行中,我们正在创建实例变量,它是静态的,其值等于MusicPlayer类型的null,但是在c#中没有这样的数据类型。在第12行,这个的意思是什么?
2.也知道静态对象只创建一次。正因为如此,当我们开始游戏时,这个物体永远不会被摧毁。但是,我们不能对一个正常的整数变量进行计数并将其值设置为0,如下所示:
int count = 0;
void Start () {
if (count > 0) {
Destroy(gameObject);
print (“delete duplicate music player”);
} else {
count++;
GameObject.DontDestroyOnLoad(gameObject);
}
}发布于 2018-03-14 00:50:35
静态变量不仅只创建一次,而且在类的所有实例中都是共享的。如果将整数变量作为静态变量,则整数变量增量方法将很好地工作,这样新的MusicPlayer实例将看到由先前创建的MusicPlayer更新的值。
使用整数变量的方法和使用MusicPlayer变量的示例都实现了相同的目标。要创建的第一个MusicPlayer实例设置了一些静态状态,这些静态状态对于以后创建的任何实例都是可见的,让它们知道一个有效的MusicPlayer实例已经被实例化了。
尽管如此,我个人认为使用最初设置为null的MusicPlayer变量是该算法更好的表示形式。
对于有关this的问题,它引用了类的这个实例。
MusicPlayer是类的名称,所以它只是对类实例的引用。
因此,您可以创建instance来保存指向MusicPlayer实例的指针。将其初始化为null。然后,在创建第一个类实例时,将instance设置为指向刚刚使用this创建的新类实例。MusicPlayer的未来实例将看到instance不是null,并将摧毁自己。
当然,这个类目前什么也不做,您仍然需要添加一个音频源或其他东西来实现音乐的播放。
发布于 2018-03-14 00:59:18
1a.您(或其他人)通过从MusicPlayer继承来创建类型MonoBehavior。因此,它现在是一种可以用于变量的类型。在类本身中包含变量(大多数语言都支持这样或那样的方式)。
1b。这是从实例函数中访问实例的一种方法。它主要用于解决类字段/属性和参数之间的任何歧义。但是,它可以用来获得一个引用来调用furtehr。
2.实际上,这个类必须实例化。没有永久存在的实例。除非我遗漏了什么,否则自动的公共和无参数的构造函数仍然存在。
有一个静态变量,您也分配一个实例(并保持它的赋值)。而静态变量恰好在类本身中。但仅此而已。
这整个方法可以工作,以确保那里“只能有一个”音乐播放器在一定程度上。当然,一个简单的方法是停止当前的MediaPlayer回放,转而启动一个新的轨道。SingletonPattern可以用来确保只有一个实例,但是对于声音播放,通常需要多个实例(旧游戏有16-32个通道的限制,但这一次很久了)。
发布于 2018-03-14 01:00:09
类本身是新数据类型的定义。当您使用MusicPlayer脚本创建一个新的游戏对象时,将创建新的MusicPlayer对象,并运行它的Start()方法。此关键字被替换为对当前对象的引用(调用这个on Start()方法),因此它只是将MusicPlayer类型的对象保存为静态变量。是的,替换单个原始数据(如bool或int )会节省内存,但是确保您不必在这个MusicPlayer上运行任何方法(比如暂停或其他什么),因为唯一的方法是保持这个引用,如果失去了它,就会失去对这个对象的控制。对象永远保留也不是真的--有一种叫做垃圾收集器的东西,它清除内存杜宁程序运行时,如果它认为不再需要对象,它就会被擦除。
https://stackoverflow.com/questions/49268087
复制相似问题