Unity定时音效播放异常:仅第二次触发音效问题求助
问题分析与修复方案
你的代码核心问题在于3秒的触发逻辑会被每帧重复执行:当timer >= 3f后,后续每帧都会进入第一个if块,反复调用prrr.Play()。而AudioSource.Play()在音频未播放完毕时,不会重新触发播放;如果音频时长较短,还会导致音频被频繁截断重复,最终你听不到3秒时的音效。此外,当timer >=6f时,两个if条件都会满足(6>=3),会连续触发两次音效,进一步干扰正常播放逻辑。
修复方案:用标志位确保单次触发
下面是修正后的代码,通过添加布尔标志位,让3秒和6秒的事件都只触发一次,避免重复执行:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class soundPlayer : MonoBehaviour { float timer; [SerializeField] private AudioSource prrr; private SpriteRenderer _spriteRenderer; private bool _hasTriggered3Sec; // 标记3秒事件是否已执行 void Start() { // 提前获取组件引用,避免每帧调用GetComponent消耗性能 _spriteRenderer = GetComponent<SpriteRenderer>(); _hasTriggered3Sec = false; } void Update() { timer += Time.deltaTime; // 仅在timer达到3秒且未触发过该事件时执行 if (timer >= 3f && !_hasTriggered3Sec) { _spriteRenderer.flipX = true; prrr.Play(); _hasTriggered3Sec = true; } // 达到6秒时执行重置逻辑 if (timer >= 6f) { prrr.Play(); _spriteRenderer.flipX = false; timer = 0; _hasTriggered3Sec = false; // 重置标志位,以便下一轮循环正常触发 } } }
额外优化点
- 缓存
SpriteRenderer引用:避免每帧调用GetComponent<SpriteRenderer>(),减少不必要的性能开销。 - 变量命名:使用下划线前缀区分私有成员变量,代码可读性更强。
内容的提问来源于stack exchange,提问作者Gerios _YT
相关产品推荐
相关产品推荐

