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

Unity场景加载后AudioClip消失及空引用错误的修复方案

问题修复:音频同时播放+空引用+Inspector变量丢失

核心问题拆解

  1. 音频同时播放:成功着陆后未锁定状态,后续碰撞仍能触发坠毁逻辑,导致两个音频叠加播放
  2. 空引用错误:startCrash方法中错误判断victorySound而非crashSound,且冗余设置AudioSource.clip
  3. Inspector变量消失:序列化引用异常,结合代码优化可解决

修复步骤

1. 修复空引用逻辑错误

startCrash方法里的判断条件完全错误,将victorySound改为crashSound,同时移除冗余的audioSource.clip赋值(PlayOneShot不需要修改AudioSource的默认clip):

private void startCrash() {
    if (crashSound != null) {
        audioSource.PlayOneShot(crashSound, crashVol);
    }
    // 其余原有代码保留
}

同时清理StartSuccess里的冗余赋值:

private void StartSuccess() {
    if (victorySound != null) {
        audioSource.PlayOneShot(victorySound, victoryVol);
    }
    // 其余原有代码保留
}

2. 锁定状态防止重复触发

添加布尔变量标记流程状态,避免成功/坠毁逻辑重复执行:

// 类内新增状态变量
private bool isEndProcessTriggered = false;

在碰撞检测开头加入状态判断,已触发结束流程则直接跳过:

private void OnCollisionEnter(Collision other) 
{
    if (isEndProcessTriggered) return;
    // 原有switch逻辑保留
}

在StartSuccess和startCrash开头设置状态为true,锁定后续触发:

private void StartSuccess()
{
    isEndProcessTriggered = true;
    // 其余原有代码保留
}

private void startCrash() {
    isEndProcessTriggered = true;
    // 其余原有代码保留
}

3. 修复Inspector变量丢失问题

  • 确保脚本字段的[SerializeField]标签正确,可添加Tooltip增强序列化稳定性:
[SerializeField, Tooltip("坠毁音效")] private AudioClip crashSound;
[SerializeField, Tooltip("胜利音效")] private AudioClip victorySound;
  • 重新拖拽AudioClip到Inspector对应字段,保存场景
  • 避免运行时动态修改这些序列化变量,当前代码无此操作,只需确保场景保存正确

完整修复代码

using UnityEngine;
using UnityEngine.SceneManagement;

public class CollisionHandler : MonoBehaviour
{
    AudioSource audioSource;
    private bool isEndProcessTriggered = false;

    [HideInInspector] public int currentSceneIndex;
    [SerializeField] private float delaySec = 1.5f;
    [SerializeField, Tooltip("坠毁音效")] private AudioClip crashSound;
    [SerializeField] private float crashVol = 0.1f;
    [SerializeField, Tooltip("胜利音效")] private AudioClip victorySound;
    [SerializeField] private float victoryVol = 0.8f;


    void Start() {
        if (audioSource == null) audioSource = GetComponent<AudioSource>();
        if (audioSource == null) {
            audioSource = gameObject.AddComponent<AudioSource>();
        }
    }


    private void OnCollisionEnter(Collision other) 
    {
        if (isEndProcessTriggered) return;

        switch (other.gameObject.tag)
        {
            case "Friendly":
                Debug.Log("Safe!");
                break;
            case "Finish":
                Debug.Log("Finished!");
                StartSuccess();
                break;
            case "Boost":
                Debug.Log("Boost!");
                break;
            case "Boundary":
                Debug.Log("Wall!");
                break;
            default:
                Debug.Log("Hit!");
                startCrash(); 
                break;
        }
    }

    private void StartSuccess()
    {
        isEndProcessTriggered = true;
        if (victorySound != null) {
            audioSource.PlayOneShot(victorySound, victoryVol);
        }
        GetComponent<PlayerMovement>().enabled = false;
        Invoke(nameof(loadLevel), delaySec);
    }

    private void startCrash() {
        isEndProcessTriggered = true;
        if (crashSound != null) {
            audioSource.PlayOneShot(crashSound, crashVol);
        }
        GetComponent<PlayerMovement>().enabled = false;
        Invoke(nameof(ReloadLevel), delaySec);
    }

    
    private void loadLevel() {
        Scene scene = SceneManager.GetActiveScene();
        currentSceneIndex = scene.buildIndex;
        int nextSceneIndex = scene.buildIndex+1;
        if (nextSceneIndex == SceneManager.sceneCountInBuildSettings) {
           nextSceneIndex = 0;
        }
         SceneManager.LoadSceneAsync(nextSceneIndex);
    }

    private void ReloadLevel() {
        currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
        SceneManager.LoadSceneAsync(currentSceneIndex);
    }
}

内容的提问来源于stack exchange,提问作者Omer Rudnick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:24:57