Передача значения из виртуальной пустоты - PullRequest
0 голосов
/ 23 февраля 2020

Я очень плохо знаком с C#, и у меня возникают проблемы с этим фрагментом кода в игре, которую я разрабатываю.

Я использую скрипт для обработки боеприпасов, и я хотел бы Проиграйте звук, когда оружие выстрелит в последнем раунде клипа (M1 Garand). Проблема в том, что переменная «ammo» выглядит как stati c и только когда-либо изменяется внутри виртуальной пустоты. Я понятия не имею, как передать измененное значение из пустоты. Мне нужно как-то определить, когда в клипе остался один выстрел, и отправить в «защищенную виртуальную пустоту» какой-то индикатор для эффекта звука выстрела, а затем запустить как звук выстрела, так и звук выброса клипа. Вот что у меня есть (я пытаюсь вставить только соответствующие части кода, так что извините, если вам не хватает некоторого контекста здесь):

public virtual void UseAmmo(int count =1)
        {
            if (ammo <= 0) return;
            ammo -= count;
            if (ammo <= 0) ammo =0;
        }

protected virtual void ShotEffect()
        {

            onShot.Invoke();

            StopCoroutine(LightOnShoot());

            if (ammo != 1)
            {
                if (source)
                {
                    //source.Stop();
                    source.pitch = (Random.Range(0.9f, 1.1f));
                    source.PlayOneShot(fireClip);
                }
            }
            else
            {
                source.Stop();
                source.PlayOneShot(lastShot);
                source.PlayOneShot(fireClip);
            }

            StartCoroutine(LightOnShoot( 0.037f));
            StartEmitters();
        }

1 Ответ

0 голосов
/ 24 февраля 2020

Лучшее решение для этого - использовать событие.

Внутри функции 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...