Unity3D防抖脚本失效:如何修复点击连发子弹的Bug?
修复Unity Photon单发枪械防抖失效问题
问题根源
- 防抖逻辑冲突:在
Use()方法中,当debounce为true时重复启动Deb()协程,导致多个协程同时修改debounce变量。第一个协程结束后会立刻将debounce设为false,后续点击就能直接触发射击,完全失去冷却效果。 - 变量重定义失效:
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
相关产品推荐
相关产品推荐

