A SoundEffectInstance
- это единичный случай воспроизведения звука; по определению, он не может быть воспроизведен более, чем по одному за раз. Конечно, вы можете иметь несколько экземпляров одного и того же SoundEffect
. Фактически, это именно то, что происходит, когда вы звоните SoundEffect.Play()
: вы создаете экземпляр и воспроизводите его.
Имея это в виду, на вашей тарелке есть несколько вариантов. Если вы [предположительно] хотите предотвратить воспроизведение миллиарда звуков полностью, когда вы удерживаете нажатой кнопку, вам определенно не следует использовать SoundEffect.Play()
, как вы уже обнаружили, будет создано много много экземпляров (это потенциально очень плохо для производительности и общего управления в любом случае). Для менее частых звуков это может быть хорошим методом.
Сказав это, каким образом можно использовать SoundEffectInstance
? В основном это может быть перезапущено с самого начала. Обратите внимание, что вы все равно можете иметь несколько SoundEffectInstance
с, по одному (или более) на каждый компонент игры. Таким образом, один из ваших пистолетов может перезапуститься и не связываться с другим экземпляром того же звука. Или вы можете выбрать только один экземпляр на звуковой эффект по соображениям производительности.
У меня были проблемы с попыткой перезапустить его "простым" способом:
instance.Stop();
instance.Play();
Исторически это не работало для меня; если это для вас, не обращайте внимания на следующее:
Что мне нужно было сделать, так это установить собственный флаг «перезапуска» для каждого экземпляра. Итак, я обернул класс SoundEffectInstance
своим собственным так:
//class that represents one sound effect instance PLUS restart flag
public class Sound
{
SoundEffectInstance instance;
bool restart;
public Sound(SoundEffectInstance i)
{
instance = i;
restart = false;
}
public bool PlayingOrRestarting()
{
return State == SoundState.Playing || restart;
}
public void Update()
{
if (restart)
{
instance.Play();
restart = false;
}
}
public void Play()
{
instance.Play();
}
public void Restart()
{
instance.Stop();
restart = true;
}
public void Stop()
{
instance.Stop();
restart = false;
}
public SoundState State
{
get { return instance.State; }
}
public float Volume
{
set { instance.Volume = value; }
get { return instance.Volume; }
}
public bool IsLooped
{
set { instance.IsLooped = value; }
get { return instance.IsLooped; }
}
}
С помощью этого метода вы должны вызывать Update () каждый кадр для каждого Sound
, поэтому храните их где-нибудь или делайте их доступными для других целей.