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

Unity场景重置后调用音频函数失效的问题排查与解决

问题:调用场景重置函数后无法播放音频的原因及解决办法

我通过按钮调用restartGame()函数重置Unity场景,但函数内的CanI()音频播放函数始终无法播放音频。已知按钮与CanI()单独使用均正常工作,想知道二者组合后失效的原因及解决办法。


原因分析

  • 核心问题是SceneManager.LoadScene(SceneManager.GetActiveScene().name)会立即触发当前场景的卸载:包括挂载LogicScript的游戏对象、它的AudioSource组件都会被销毁。
  • 你在调用LoadScene之后才执行CanI(),此时代码虽然会执行,但AudioSource已经不存在,自然无法播放音频;就算侥幸执行,场景加载完成后新的场景实例会覆盖当前状态,音频播放也会被直接打断。

解决办法

方案1:等待音频播放完毕后再加载场景

利用协程等待音频时长,确保音频播放完成后再切换场景:

public void restartGame()
{
    CanI();
    // 开启协程等待音频播放完毕后加载场景
    StartCoroutine(LoadSceneAfterAudio(sfx3.length));
}

private IEnumerator LoadSceneAfterAudio(float delay)
{
    yield return new WaitForSeconds(delay);
    SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}

方案2:把音频播放放到场景加载后的初始化逻辑里

如果需要场景加载完成后播放音频:

  1. 在LogicScript中添加Start()方法,场景加载完成后自动触发播放:
void Start()
{
    CanI();
}
  1. 修改restartGame(),只保留场景加载逻辑:
public void restartGame()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}

方案3:让音频对象不随场景销毁

将AudioSource所在的游戏对象设置为DontDestroyOnLoad,场景切换时它不会被销毁,就能正常播放音频:
在LogicScript的Awake()方法中添加:

void Awake()
{
    DontDestroyOnLoad(gameObject);
}

注意:可以加单例判断避免场景加载后出现多个重复的音频对象。


原始代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LogicScript : MonoBehaviour
{
   public int score;
    public Text scoreText;
    public GameObject GameOverScreen;



    [ContextMenu ("add score")]
    public void addScore(int scoreToAdd)
    { 
        score += scoreToAdd;
        scoreText.text = score.ToString() +" Majors";
    }
    public void restartGame()
    {
        
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        CanI();
         
    }

    public void GameOver()
    {
        GameOverScreen.SetActive(true);
    }

    public AudioSource src;
    public AudioClip sfx, sfx2, sfx3, sfx4; 

    public void weMajor()
    {
        src.clip = sfx;
        src.Play();
    }

    public void End()
    {
        src.clip = sfx2;
        src.Play();
    }
    public void CanI()
    {
        src.clip = sfx3;
        src.Play();
    }

    public void Intro()
    {
        src.clip = sfx4;
        src.Play();
    }

}

内容的提问来源于stack exchange,提问作者swag money wizz jizz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:06:09