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

时间:2014-05-15 11:26:15

标签: c# .net oop member static

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

以下是我的代码:

public class SoundManager : MonoBehaviour {

public List<AudioSource> audioSounds = new List<AudioSource>();
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);
    }
}
}

5 个答案:

答案 0 :(得分:31)

您应该将audioSounds和minTime成员设为静态:

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

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

public class SoundManager : MonoBehaviour
{

    public List<AudioSource> audioSounds = new List<AudioSource>();
    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);
        }

    }
}

答案 1 :(得分:7)

我猜你在访问audioSoundsminTime时遇到了错误,对吗?

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

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

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

答案 2 :(得分:3)

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

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

public static List<AudioSource> audioSounds = new List<AudioSource>();
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;
    }
}

答案 3 :(得分:2)

playSound是您班级中的静态方法,但您指的是audioSoundsminTime等未声明为static的成员,因此他们需要SoundManager sm = new SoundManager();来分别作为sm.audioSoundssm.minTime

运作

解决方案:

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

答案 4 :(得分:1)

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

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

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

Static keyword in c#