Лучшее решение для этого - использовать событие.
Внутри функции UseAmmo вам необходимо выполнить проверку:
public virtual void UseAmmo(int count =1)
{
if (ammo <= 0) return;
//store old ammo
oldAmmo = ammo;
ammo -= count;
//Need to make sure ammo actually changed, and is now down to 1
if (ammo != oldAmmo && ammo == 1) {
ClipIsLow();
}
if (ammo <= 0) ammo =0;
}
Теперь вам нужна функция ClipIsLow()
, которая запускает событие. Вы можете посмотреть события и делегаты для получения дополнительной информации. После этого у вас будет отдельный сценарий для вашего аудио, который прослушивает событие clipIsLow
и затем воспроизводит звук.
void ClipIsLow() {
GunEvents.ClipIsLow();
}
Тогда у вас будет класс GunEvents:
public static class GunEvents {
delegate void ClipIsLowEvent();
public static event ClipIsLowEvent OnClipIsLow;
//this is how we fire the event
public static void ClipIsLow(){
OnClipIsLow?.Invoke();
}
}
затем, в вашем аудио скрипте (monobehaviour)
void OnEnable() {
//listen to event, if event occurs call PlayLowClipSound
GunEvents.OnClipIsLow += PlayLowClipSound;
}
void OnDisable() {
//Stop listening to event. Important to avoid memory leak.
GunEvents.OnClipIsLow -= PlayLowClipSound;
}
//Method that is called when event fires. Actually plays the sound.
void PlayLowClipSound() {
lowClipAudioSource.Play()
}
Если вы не хотите изучать события, вы можете просто добавить следующее внутри того же класса, что и ваш UseAmmo
метод., хотя это Конечно, движение вперед будет плохим, поскольку оно связывает ваш сценарий боеприпасов с воспроизведением аудио, что никогда не было хорошей идеей. Ваш сценарий с боеприпасами не должен волновать, какие звуки играют в вашей игре.
Но так как вы сказали, что вы новичок, то здесь все равно.
void ClipIsLow() {
audioSource.Play();
}