news 2026/6/1 13:29:11

游戏音效脚本添加

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
游戏音效脚本添加

1. 音效管理器主脚本

usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.Audio;publicenumSoundType{// 背景音乐BackgroundMusic,// 游戏音效BlockClick,BlockMatch,BlockDestroy,BlockPlace,// 道具音效PowerUpCollect,PowerUpUse,PowerUpSpecial,// UI音效UIClick,UIButtonHover,UIOpenMenu,UICloseMenu,UINotification,UISuccess,UIFailure,// 游戏状态音效GameStart,GameOver,LevelComplete,ScoreIncrease}[System.Serializable]publicclassSound{publicSoundTypetype;publicAudioClipclip;[Range(0f,1f)]publicfloatvolume=1f;[Range(0.1f,3f)]publicfloatpitch=1f;publicboolloop=false;[HideInInspector]publicAudioSourcesource;}publicclassAudioManager:MonoBehaviour{publicstaticAudioManagerInstance{get;privateset;}[Header("音频混合器")]publicAudioMixeraudioMixer;[Header("音效列表")][SerializeField]privateList<Sound>sounds=newList<Sound>();[Header("音效设置")][SerializeField]privatefloatsoundFadeDuration=1f;privateDictionary<SoundType,Sound>soundDictionary=newDictionary<SoundType,Sound>();privateSoundcurrentBackgroundMusic;privateCoroutinefadeCoroutine;voidAwake(){// 单例模式if(Instance==null){Instance=this;DontDestroyOnLoad(gameObject);}else{Destroy(gameObject);return;}InitializeSounds();LoadAudioSettings();}voidInitializeSounds(){foreach(Soundsoundinsounds){AudioSourcesource=gameObject.AddComponent<AudioSource>();source.clip=sound.clip;source.volume=sound.volume;source.pitch=sound.pitch;source.loop=sound.loop;sound.source=source;soundDictionary[sound.type]=sound;}}publicvoidPlaySound(SoundTypetype,booloneShot=false){if(soundDictionary.TryGetValue(type,outSoundsound)){if(oneShot){sound.source.PlayOneShot(sound.clip,sound.volume);}else{sound.source.Play();}}else{Debug.LogWarning($"音效{type}未找到!");}}publicvoidStopSound(SoundTypetype){if(soundDictionary.TryGetValue(type,outSoundsound)){sound.source.Stop();}}publicvoidPlayBackgroundMusic(SoundTypetype,boolfade=true){if(soundDictionary.TryGetValue(type,outSoundnewBackgroundMusic)){if(fadeCoroutine!=null){StopCoroutine(fadeCoroutine);}fadeCoroutine=StartCoroutine(FadeBackgroundMusic(newBackgroundMusic,fade));}}privateIEnumeratorFadeBackgroundMusic(SoundnewBackgroundMusic,boolfade){// 淡出当前背景音乐if(currentBackgroundMusic!=null&&currentBackgroundMusic.source.isPlaying){floatstartVolume=currentBackgroundMusic.source.volume;floattimer=0f;while(timer<soundFadeDuration){timer+=Time.deltaTime;currentBackgroundMusic.source.volume=Mathf.Lerp(startVolume,0f,timer/soundFadeDuration);yieldreturnnull;}currentBackgroundMusic.source.Stop();currentBackgroundMusic.source.volume=startVolume;}// 播放新的背景音乐currentBackgroundMusic=newBackgroundMusic;if(fade){currentBackgroundMusic.source.volume=0f;currentBackgroundMusic.source.Play();floattimer=0f;while(timer<soundFadeDuration){timer+=Time.deltaTime;currentBackgroundMusic.source.volume=Mathf.Lerp(0f,currentBackgroundMusic.volume,timer/soundFadeDuration);yieldreturnnull;}}else{currentBackgroundMusic.source.volume=currentBackgroundMusic.volume;currentBackgroundMusic.source.Play();}}publicvoidSetMasterVolume(floatvolume){audioMixer.SetFloat("MasterVolume",Mathf.Log10(volume)*20);PlayerPrefs.SetFloat("MasterVolume",volume);}publicvoidSetMusicVolume(floatvolume){audioMixer.SetFloat("MusicVolume",Mathf.Log10(volume)*20);PlayerPrefs.SetFloat("MusicVolume",volume);}publicvoidSetSFXVolume(floatvolume){audioMixer.SetFloat("SFXVolume",Mathf.Log10(volume)*20);PlayerPrefs.SetFloat("SFXVolume",volume);}privatevoidLoadAudioSettings(){// 加载保存的音量设置SetMasterVolume(PlayerPrefs.GetFloat("MasterVolume",1f));SetMusicVolume(PlayerPrefs.GetFloat("MusicVolume",1f));SetSFXVolume(PlayerPrefs.GetFloat("SFXVolume",1f));}// 快捷方法publicvoidPlayBlockClick()=>PlaySound(SoundType.BlockClick,true);publicvoidPlayBlockMatch()=>PlaySound(SoundType.BlockMatch,true);publicvoidPlayBlockDestroy()=>PlaySound(SoundType.BlockDestroy,true);publicvoidPlayUIClick()=>PlaySound(SoundType.UIClick,true);publicvoidPlayPowerUpUse()=>PlaySound(SoundType.PowerUpUse,true);}

2. UI音效触发器脚本

usingUnityEngine;usingUnityEngine.EventSystems;usingUnityEngine.UI;publicclassUISoundTrigger:MonoBehaviour,IPointerEnterHandler,IPointerClickHandler{[Header("音效设置")][SerializeField]privateSoundTypeclickSound=SoundType.UIClick;[SerializeField]privateSoundTypehoverSound=SoundType.UIButtonHover;[SerializeField]privateboolenableHoverSound=true;privateButtonbutton;privateToggletoggle;privateSliderslider;voidStart(){button=GetComponent<Button>();toggle=GetComponent<Toggle>();slider=GetComponent<Slider>();// 为UI组件添加声音if(button!=null){button.onClick.AddListener(OnButtonClick);}if(toggle!=null){toggle.onValueChanged.AddListener(OnToggleValueChanged);}if(slider!=null){slider.onValueChanged.AddListener(OnSliderValueChanged);}}privatevoidOnButtonClick(){if(AudioManager.Instance!=null){AudioManager.Instance.PlaySound(clickSound,true);}}privatevoidOnToggleValueChanged(boolisOn){if(AudioManager.Instance!=null&&isOn){AudioManager.Instance.PlaySound(clickSound,true);}}privatevoidOnSliderValueChanged(floatvalue){// 可以为滑动条添加特殊音效if(AudioManager.Instance!=null){AudioManager.Instance.PlaySound(SoundType.UIClick,true);}}publicvoidOnPointerClick(PointerEventDataeventData){// 备用点击检测if(button==null&&toggle==null&&slider==null){if(AudioManager.Instance!=null){AudioManager.Instance.PlaySound(clickSound,true);}}}publicvoidOnPointerEnter(PointerEventDataeventData){if(enableHoverSound&&AudioManager.Instance!=null){AudioManager.Instance.PlaySound(hoverSound,true);}}}

3. 游戏块音效脚本

usingUnityEngine;publicclassBlockSoundController:MonoBehaviour{[Header("音效设置")][SerializeField]privateSoundTypeclickSound=SoundType.BlockClick;[SerializeField]privateSoundTypematchSound=SoundType.BlockMatch;[SerializeField]privateSoundTypedestroySound=SoundType.BlockDestroy;[SerializeField]privateSoundTypeplaceSound=SoundType.BlockPlace;[Header("音效触发")][SerializeField]privateboolplayOnClick=true;[SerializeField]privateboolplayOnDestroy=true;privateColliderblockCollider;voidStart(){blockCollider=GetComponent<Collider>();if(blockCollider==null){blockCollider=gameObject.AddComponent<BoxCollider>();}}voidOnMouseDown(){if(playOnClick&&AudioManager.Instance!=null){AudioManager.Instance.PlaySound(clickSound,true);}}voidOnDestroy(){if(playOnDestroy&&AudioManager.Instance!=null){AudioManager.Instance.PlaySound(destroySound,true);}}publicvoidPlayMatchSound(){if(AudioManager.Instance!=null){AudioManager.Instance.PlaySound(matchSound,true);}}publicvoidPlayPlaceSound(){if(AudioManager.Instance!=null){AudioManager.Instance.PlaySound(placeSound,true);}}}

4. 音效设置UI面板

usingUnityEngine;usingUnityEngine.UI;publicclassAudioSettingsPanel:MonoBehaviour{[Header("音量控制滑块")][SerializeField]privateSlidermasterVolumeSlider;[SerializeField]privateSlidermusicVolumeSlider;[SerializeField]privateSlidersfxVolumeSlider;[Header("测试按钮")][SerializeField]privateButtontestSFXButton;[SerializeField]privateButtontestMusicButton;voidStart(){InitializeSliders();SetupTestButtons();}voidInitializeSliders(){if(masterVolumeSlider!=null){masterVolumeSlider.value=PlayerPrefs.GetFloat("MasterVolume",1f);masterVolumeSlider.onValueChanged.AddListener(OnMasterVolumeChanged);}if(musicVolumeSlider!=null){musicVolumeSlider.value=PlayerPrefs.GetFloat("MusicVolume",1f);musicVolumeSlider.onValueChanged.AddListener(OnMusicVolumeChanged);}if(sfxVolumeSlider!=null){sfxVolumeSlider.value=PlayerPrefs.GetFloat("SFXVolume",1f);sfxVolumeSlider.onValueChanged.AddListener(OnSFXVolumeChanged);}}voidSetupTestButtons(){if(testSFXButton!=null){testSFXButton.onClick.AddListener(()=>{if(AudioManager.Instance!=null){AudioManager.Instance.PlaySound(SoundType.UIClick,true);}});}if(testMusicButton!=null){testMusicButton.onClick.AddListener(()=>{if(AudioManager.Instance!=null){AudioManager.Instance.PlaySound(SoundType.UISuccess,true);}});}}voidOnMasterVolumeChanged(floatvalue){if(AudioManager.Instance!=null){AudioManager.Instance.SetMasterVolume(value);}}voidOnMusicVolumeChanged(floatvalue){if(AudioManager.Instance!=null){AudioManager.Instance.SetMusicVolume(value);}}voidOnSFXVolumeChanged(floatvalue){if(AudioManager.Instance!=null){AudioManager.Instance.SetSFXVolume(value);}}}

5. 音频混合器设置(AudioMixer)

创建一个AudioMixer并命名为"MainMixer",设置以下参数:

  • MasterVolume (暴露参数)
  • MusicVolume (暴露参数)
  • SFXVolume (暴露参数)

6. 音效文件建议

  1. 背景音乐

    • 游戏配乐:可在pixabay.com的"游戏配乐"分类查找
    • 休闲背景音乐:适合消除类游戏
  2. 方块音效

    • 点击:清脆的"click"或"pop"声
    • 消除:短促的"ding"或"ping"声
    • 放置:轻微的"thud"或"tap"声
  3. UI音效

    • 点击:界面按钮音效
    • 悬停:轻微的"hover"声
    • 通知:短促提示音
  4. 道具音效

    • 收集:悦耳的"collect"声
    • 使用:特殊效果音

7. 使用示例脚本

usingUnityEngine;publicclassGameController:MonoBehaviour{voidStart(){// 播放背景音乐AudioManager.Instance.PlayBackgroundMusic(SoundType.BackgroundMusic,true);// 游戏开始音效AudioManager.Instance.PlaySound(SoundType.GameStart,true);}publicvoidOnBlockMatched(){// 方块匹配音效AudioManager.Instance.PlaySound(SoundType.BlockMatch,true);// 如果连续匹配,可以播放特殊音效if(IsCombo()){AudioManager.Instance.PlaySound(SoundType.PowerUpSpecial,true);}}publicvoidOnPowerUpCollected(){// 收集道具音效AudioManager.Instance.PlaySound(SoundType.PowerUpCollect,true);}publicvoidOnLevelComplete(){// 停止背景音乐AudioManager.Instance.StopSound(SoundType.BackgroundMusic);// 播放完成音效AudioManager.Instance.PlaySound(SoundType.LevelComplete,true);}privateboolIsCombo(){// 判断连击逻辑returnfalse;}}

安装步骤:

  1. 创建一个空GameObject,命名为"AudioManager"
  2. 将AudioManager脚本附加到该对象
  3. 在Inspector面板中,为每种SoundType分配对应的AudioClip
  4. 为UI按钮添加UISoundTrigger脚本
  5. 为游戏块添加BlockSoundController脚本
  6. 创建音量设置面板并附加AudioSettingsPanel脚本
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 21:58:51

Citra模拟器终极指南:3个步骤让你在电脑畅玩3DS游戏

Citra模拟器终极指南&#xff1a;3个步骤让你在电脑畅玩3DS游戏 【免费下载链接】citra 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 还在为无法在电脑上体验任天堂3DS游戏而烦恼吗&#xff1f;想要在大屏幕上重温经典游戏却不知道如何操作&#xff1f;本…

作者头像 李华
网站建设 2026/6/1 10:44:19

基于Java电商网购管理系统设计

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/5/30 7:05:04

打造iOS应用中的文本显示新高度:YYLabel深度解析

还在为iOS应用中的文本显示效果不够理想而苦恼吗&#xff1f;&#x1f615; 想要让普通的文字也能拥有丰富的视觉效果和交互体验&#xff1f;今天我要向大家介绍一个能让你的应用文本展示瞬间提升档次的神器——YYLabel&#xff01;&#x1f389; 【免费下载链接】YYText Power…

作者头像 李华
网站建设 2026/5/30 0:36:05

基于Python+Vue开发的鲜牛奶订购管理系统源码+运行步骤+计算机专业

项目简介 该项目是基于PythonVue开发的鲜牛奶订购管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Python的牛奶…

作者头像 李华
网站建设 2026/5/30 20:24:31

5分钟掌握ADBKeyBoard:Android自动化测试终极输入解决方案

5分钟掌握ADBKeyBoard&#xff1a;Android自动化测试终极输入解决方案 【免费下载链接】ADBKeyBoard Android Virtual Keyboard Input via ADB (Useful for Test Automation) 项目地址: https://gitcode.com/gh_mirrors/ad/ADBKeyBoard ADBKeyBoard是一款专为Android自动…

作者头像 李华
网站建设 2026/5/31 2:03:53

KITTI-360数据集:解锁自动驾驶场景理解的五大核心优势

在自动驾驶技术飞速发展的当下&#xff0c;高质量数据集已成为推动算法创新的关键要素。KITTI-360数据集凭借其32万张图像和10万个激光扫描的庞大规模&#xff0c;为研究者提供了73.7公里真实驾驶场景的完整记录&#xff0c;成为自动驾驶场景理解领域的重要基础设施。 【免费下…

作者头像 李华