You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Unity C#按住射击按钮循环播放枪声的实现问题求助

解决第三人称射击游戏中按住射击按钮时枪声延迟播放的问题

嘿,刚看完你的问题和代码,这情况我刚学Unity的时候也碰到过!咱们先搞清楚为啥会这样,再一步步把它搞定。

问题根源

你现在用的AudioSource.Play()有个特性:如果当前音频还在播放状态,再次调用Play()是不会触发新的播放的,只会忽略这个请求。而你的连射逻辑是按住Fire1时每隔fireRate时间调用一次FireGun(),如果你的枪声音频时长比fireRate长,那前一次枪声还没播完,后面的Play()就都失效了——直到你松开按钮,最后一次的调用刚好赶上前一声播完,才会播放出来。

解决方案(推荐方案):用PlayOneShot()替代Play()

PlayOneShot()是Unity专门为这种需要多次触发同一段音频的场景设计的,它会创建临时的音频实例,哪怕前一次的枪声还在响,新的枪声也能正常播放。只需要修改FireGun()里的音频播放代码就行:

把原来的:

gunFireSource.Play();

改成:

gunFireSource.PlayOneShot(gunFireSource.clip);

如果想更灵活,还可以单独加一个AudioClip字段来指定射击音效,这样不用依赖AudioSource上的默认clip,修改后的完整代码如下:

using UnityEngine;
public class Gun : MonoBehaviour {
    [SerializeField] [Range(0f, 2f)] private float fireRate = 1;
    [SerializeField] [Range(1, 10)] private int damage = 1;
    [SerializeField] private Transform firePoint;
    [SerializeField] private ParticleSystem muzzleParticle;
    [SerializeField] private AudioSource gunFireSource;
    [SerializeField] private AudioClip gunFireClip; // 可选:单独指定射击音效
    private float timer;

    void Update() {
        timer += Time.deltaTime;
        if (timer >= fireRate) {
            if (Input.GetButton("Fire1")) {
                timer = 0f;
                FireGun();
            }
        }
    }

    private void FireGun() {
        //Debug.DrawRay(firePoint.position, firePoint.forward * 100, Color.red, 2f);
        muzzleParticle.Play();
        // 优先使用单独指定的音效,没有的话用AudioSource默认的clip
        gunFireSource.PlayOneShot(gunFireClip ?? gunFireSource.clip);
        
        Ray ray = new Ray(firePoint.position, firePoint.forward);
        RaycastHit hitInfo;
        if (Physics.Raycast(ray, out hitInfo, 100)) {
            var health = hitInfo.collider.GetComponent<Health>();
            if (health != null) health.TakeDamage(damage);
        }
    }
}

额外说明

如果你不想用PlayOneShot(),也可以在调用Play()前判断!gunFireSource.isPlaying,但这样会导致连射时枪声只能断断续续的响,完全不符合射击游戏的连射体验,所以还是优先选PlayOneShot()哈。

内容的提问来源于stack exchange,提问作者Mango Studija

火山引擎 最新活动