我是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();
}
答案 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();
}