首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c#中“这”是什么,静态字段怎么可能是"null"?

在c#中“这”是什么,静态字段怎么可能是"null"?
EN

Stack Overflow用户
提问于 2018-03-14 00:40:28
回答 3查看 217关注 0票数 1

我正在学习统一4.6.9的游戏开发。当我把背景音乐添加到我的游戏中时,每当我点击play再一次按钮,它就会堆叠起来。因此,我搜索并发现,每当我再次单击“播放”时,我都必须销毁创建额外的音乐对象,所以我使用了以下代码:-

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
int count = 0;
void Start () {
    if (count > 0) {
        Destroy(gameObject);
        print (“delete duplicate music player”);
    } else {
        count++;
        GameObject.DontDestroyOnLoad(gameObject);
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-14 00:50:35

静态变量不仅只创建一次,而且在类的所有实例中都是共享的。如果将整数变量作为静态变量,则整数变量增量方法将很好地工作,这样新的MusicPlayer实例将看到由先前创建的MusicPlayer更新的值。

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

尽管如此,我个人认为使用最初设置为null的MusicPlayer变量是该算法更好的表示形式。

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

MusicPlayer是类的名称,所以它只是对类实例的引用。

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-03-14 00:59:18

1a.您(或其他人)通过从MusicPlayer继承来创建类型MonoBehavior。因此,它现在是一种可以用于变量的类型。在类本身中包含变量(大多数语言都支持这样或那样的方式)。

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

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

有一个静态变量,您也分配一个实例(并保持它的赋值)。而静态变量恰好在类本身中。但仅此而已。

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

票数 0
EN

Stack Overflow用户

发布于 2018-03-14 01:00:09

类本身是新数据类型的定义。当您使用MusicPlayer脚本创建一个新的游戏对象时,将创建新的MusicPlayer对象,并运行它的Start()方法。此关键字被替换为对当前对象的引用(调用这个on Start()方法),因此它只是将MusicPlayer类型的对象保存为静态变量。是的,替换单个原始数据(如bool或int )会节省内存,但是确保您不必在这个MusicPlayer上运行任何方法(比如暂停或其他什么),因为唯一的方法是保持这个引用,如果失去了它,就会失去对这个对象的控制。对象永远保留也不是真的--有一种叫做垃圾收集器的东西,它清除内存杜宁程序运行时,如果它认为不再需要对象,它就会被擦除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49268087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档