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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:30:57