访问非静态成员需要对象引用

我有这个错误出现,我不知道为什么……我试图查找它,人们说要创建类的对象或创建方法为静态…但我是不确定如何。

这是我的代码如下:

public class SoundManager : MonoBehaviour { public List audioSounds = new List(); public double minTime = 0.5; public static void playSound(AudioClip sourceSound, Vector3 objectPosition, int volume, float audioPitch, int dopplerLevel) { bool playsound = false; foreach (AudioSource sound in audioSounds) // Loop through List with foreach { if (sourceSound.name != sound.name && sound.time <= minTime) { playsound = true; } } if(playsound) { AudioSource.PlayClipAtPoint(sourceSound, objectPosition); } } } 

您应该使audioSounds和minTime成员静态:

 public static List audioSounds = new List(); public static double minTime = 0.5; 

但我会考虑使用单例对象而不是静态成员:

 public class SoundManager : MonoBehaviour { public List audioSounds = new List(); public double minTime = 0.5; public static SoundManager Instance { get; private set; } void Awake() { Instance = this; } public void playSound(AudioClip sourceSound, Vector3 objectPosition, int volume, float audioPitch, int dopplerLevel) { bool playsound = false; foreach (AudioSource sound in audioSounds) // Loop through List with foreach { if (sourceSound.name != sound.name && sound.time <= minTime) { playsound = true; } } if(playsound) { AudioSource.PlayClipAtPoint(sourceSound, objectPosition); } } } 

我猜你得到了访问audioSoundsminTime的错误,对吗?

问题是您无法从static methods访问instance members 。 这意味着,静态方法是一种只存在一次并且可以被所有其他对象使用的方法(如果它的访问修饰符允许它)。

另一方面, 为对象的每个实例创建实例成员。 因此,如果您创建了十个实例,运行时将如何知道所有这些实例,它应该访问哪个audioSounds列表?

像其他人说的那样,让你的audioSoundsminTime静态,或者你可以让你的方法成为实例方法,如果你的设计允许的话。

playSound是一个静态方法,意味着它在加载程序时存在。 audioSounds和minTime是SoundManager实例变量,这意味着它们将存在于SoundManager的实例中。 您尚未创建SoundManager实例,因此audioSounds不存在(或者它确实存在但您没有对SoundManager对象的引用来查看)。

要解决您的问题,您可以将audioSounds设为静态:

 public static List audioSounds = new List(); public static double minTime = 0.5; 

因此它们将被创建并且可以以与PlaySound相同的方式引用。 或者,您可以在方法中创建一个SoundManager实例:

 SoundManager soundManager = new SoundManager(); foreach (AudioSource sound in soundManager.audioSounds) // Loop through List with foreach { if (sourceSound.name != sound.name && sound.time <= soundManager.minTime) { playsound = true; } } 

playSound是你class级中的一个静态方法,但是你指的是audioSoundsminTime这样的成员,它们没有被声明为static因此它们需要一个SoundManager sm = new SoundManager(); 分别作为sm.audioSoundssm.minTime运行

解:

 public static List audioSounds = new List(); public static double minTime = 0.5; 

audioSoundsminTime变量设置为静态变量,就像在静态方法( playSound )中使用它们一样。

将方法标记为static可防止在该方法中使用非静态(实例)成员。

要了解更多信息,请阅读此SO QA:

c#中的静态关键字