You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity3D防抖脚本失效:如何修复点击连发子弹的Bug?

修复Unity Photon单发枪械防抖失效问题

问题根源

  1. 防抖逻辑冲突:在Use()方法中,当debounce为true时重复启动Deb()协程,导致多个协程同时修改debounce变量。第一个协程结束后会立刻将debounce设为false,后续点击就能直接触发射击,完全失去冷却效果。
  2. 变量重定义失效:Start()和Update()里的timeStarted、audioTime被定义成局部变量,覆盖了类的成员变量,导致音频同步逻辑根本没起作用。

修复后的完整代码

using Photon.Pun;
using System.Collections;
using UnityEngine;

public class SingleShotGun : Gun
{
    [SerializeField] Camera cam;

    PhotonView PV;

    public bool debounce = false;
    public float debounce2; // 建议重命名为fireRate,语义更清晰

    public AudioSource audioSource;
    public AudioClip audioClip;

    private float timeStarted;
    private float audioTime;

    void Awake()
    {
        PV = GetComponent<PhotonView>();
    }

    private void Start()
    {
        if (PV.IsMine)
        {
            audioSource.clip = audioClip;
            // 移除局部变量声明,直接赋值给成员变量
            timeStarted = (float)PhotonNetwork.Time;
            audioTime = 0;
        }
    }

    private void Update()
    {
        if (PV.IsMine)
        {
            // 移除局部变量声明,直接赋值给成员变量
            audioTime = (float)PhotonNetwork.Time - timeStarted;
        }
        else
        {
            audioSource.time = audioTime;
        }
    }

    public override void Use()
    {
        // 冷却中直接返回,不执行任何操作
        if (debounce)
        {
            return;
        }

        if (PV.IsMine)
        {
            audioSource.clip = audioClip;
            timeStarted = (float)PhotonNetwork.Time;
            audioSource.Play(); // 补充音频播放逻辑,原代码缺失
        }

        // 标记冷却状态,启动一次冷却协程
        debounce = true;
        Shoot();
        StartCoroutine(Deb());
    }

    private IEnumerator Deb()
    {
        Debug.Log("枪械冷却中");
        yield return new WaitForSeconds(debounce2);
        debounce = false;
        Debug.Log("冷却结束,可再次射击");
    }
}

关键修改说明

  • 修正防抖逻辑:删除了冷却状态下重复启动协程的代码,仅在射击时启动一次冷却协程,避免多协程冲突修改debounce。
  • 修复变量覆盖:移除局部变量的float声明,确保成员变量被正确赋值,音频同步逻辑正常工作。
  • 补充核心逻辑:添加audioSource.Play()确保射击时音频正常播放,原代码没有触发播放的逻辑。
  • 可读性优化:添加注释建议重命名变量,让代码语义更直观。

内容的提问来源于stack exchange,提问作者Hee Mama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:30:59