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);
}
}
}
2020 年 9 月からの更新:
6 年経った今でも、これは StackOverflow に関する私の最も支持されている回答の 1 つであるため、追加する義務があると感じています。どこからでもアクセスでき、さまざまなゲーム システムにシングルトンを使用すると、プロジェクトのさまざまな部分の間に目に見えない依存関係のスパゲッティが作成されます。
プログラミングを学んでいるだけなら、今のところシングルトンを使用しても問題ありません。ただし、依存性注入、制御の反転、およびその他のアーキテクチャ パターンについて読むことを検討してください。少なくとも「後で学ぶもの」の下にファイルしてください。これらについて初めて知ったときは、やり過ぎに聞こえるかもしれませんが、適切なアーキテクチャは、中規模および大規模なプロジェクトの命の恩人になる可能性があります。
audioSounds
にアクセスするとエラーが発生すると思います と minTime
ですよね?
問題は instance members
にアクセスできないことです static methods
から .つまり、静的メソッドは 1 回だけ存在し、他のすべてのオブジェクトで使用できるメソッドです (アクセス修飾子で許可されている場合)。
一方、インスタンス メンバーは、オブジェクトのインスタンスごとに作成されます。 .したがって、10 個のインスタンスを作成した場合、ランタイムはこれらすべてのインスタンスからどの audioSounds
をどのように知るのでしょうか? アクセスすべきリスト?
他の人が言ったように、あなたの audioSounds
を作ってください そして minTime
静的にするか、設計で許可されている場合は、メソッドをインスタンス メソッドにすることができます。
playSound は、プログラムがロードされたときに存在することを意味する静的メソッドです。audioSounds と minTime は、SoundManager インスタンス変数であり、SoundManager のインスタンス内に存在することを意味します。SoundManager のインスタンスを作成していないため、audioSounds は存在しません (または存在します)。ただし、それを確認するための SoundManager オブジェクトへの参照はありません)。
この問題を解決するには、audioSounds を static にすることができます:
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;
}
}