私はこのエラーが発生していますが、なぜ...私はそれを調べようとしましたが、人々はクラスのオブジェクトを作成するか、メソッドを静的として作成するように言っています...しかし私は方法がわからない。
以下は私のコードです:
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);
}
}
}
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);
}
}
}
audioSounds
とminTime
にアクセスするとエラーが発生すると思いますよね?
問題は、instance members
からstatic methods
にアクセスできないことです。これが意味することは、静的メソッドは一度だけ存在し、他のすべてのオブジェクトで使用できるメソッドであることです(アクセス修飾子が許可する場合)。
一方、インスタンスメンバーは作成されますオブジェクトのすべてのインスタンスに対して。 10個のインスタンスを作成した場合、ランタイムはこれらすべてのインスタンスからどのaudioSounds
リストにアクセスする必要があるかをどのように知るのでしょうか?
他の人が言ったように、audioSounds
とminTime
を静的にするか、設計で許可されている場合は、メソッドをインスタンスメソッドにすることもできます。
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;
}
}
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;
audioSounds
およびminTime
変数を静的メソッド(playSound
)で使用しているので、それらを静的変数として作成します。
メソッドをstatic
としてマークすると、そのメソッドで非静的(インスタンス)メンバーが使用されなくなります。
詳細については、こちらをご覧くださいSO QA: