我出现了这个错误并且我不确定为什么......我试图查找它,人们说要创建类的对象或创建方法为静态...但是我不确定如何。
以下是我的代码:
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);
}
}
}
答案 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)
我猜你在访问audioSounds
和minTime
时遇到了错误,对吗?
问题是您无法从instance members
访问static methods
。这意味着,静态方法是一种只存在一次并且可以被所有其他对象使用的方法(如果它的访问修饰符允许的话)。
另一方面,实例成员是为对象的每个实例创建 。因此,如果您创建了十个实例,那么运行时如何知道所有这些实例,audioSounds
列出它应该访问哪些实例?
像其他人说的那样,让您的audioSounds
和minTime
静态,或者如果您的设计允许,您可以将您的方法设为实例方法。
答案 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是您班级中的静态方法,但您指的是audioSounds
或minTime
等未声明为static
的成员,因此他们需要SoundManager sm = new SoundManager();
来分别作为sm.audioSounds
或sm.minTime
解决方案:
public static List<AudioSource> audioSounds = new List<AudioSource>();
public static double minTime = 0.5;
答案 4 :(得分:1)
将您的audioSounds
和minTime
变量设置为静态变量,就像在静态方法(playSound
)中使用它们一样。
将方法标记为static
可防止在该方法中使用非静态(实例)成员。
要了解更多信息,请阅读此SO QA: