从虚拟虚空传递值

时间:2020-02-23 19:08:35

标签: c# unity3d

我是C#的新手,在我开发的游戏中,这段代码有问题。

我正在使用脚本来处理弹药,当武器在剪辑(M1 Garand)的最后一轮开火时,我想播放声音。问题是“ ammo”变量似乎是静态的,并且只能在虚拟void内部进行更改。我不知道如何将更改后的值从空中传递出去。我需要以某种方式检测剪辑中何时还有镜头,然后将某种指示符发送到“受保护的虚拟空隙”以产生镜头声音效果,然后触发镜头声音和剪辑弹出声音。到目前为止,这是我想要的(我试图仅粘贴代码的相关部分,如果您在此处缺少某些上下文,请原谅我):

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 :(得分:0)

对此的最佳解决方案是使用事件。

在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();
   }
}

然后,在您的音频脚本中(单行为)

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();
}
相关问题