news 2026/6/9 6:30:06

游戏音效脚本添加

作者头像

张小明

前端开发工程师

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/6/9 15:12:35

DAIR-V2X车路协同数据集:从零开始的终极实践指南

车路协同技术正在重塑自动驾驶的未来格局&#xff0c;而DAIR-V2X数据集作为业界首个真实世界的车路协同自动驾驶数据集&#xff0c;为研究者和开发者提供了前所未有的技术资源。本文将带你深度剖析这一革命性数据集&#xff0c;掌握从环境搭建到实战应用的完整技术链条。 【免费…

作者头像 李华
网站建设 2026/6/5 20:20:35

打造你的专属流媒体平台:Jellyfin跨设备部署终极指南

打造你的专属流媒体平台&#xff1a;Jellyfin跨设备部署终极指南 【免费下载链接】jellyfin Jellyfin 是一个自由、开源的家庭媒体中心软件&#xff0c;适合用来搭建个人化的多媒体服务器&#xff0c;特点是跨平台支持&#xff0c;提供视频、音频和图片的集中管理和流媒体服务&…

作者头像 李华
网站建设 2026/6/5 19:48:49

基于springboot和vue的新能源共享汽车租赁管理系统的设计与实现

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

作者头像 李华
网站建设 2026/6/9 18:56:36

2026 届秋招真相:薪资差距、学历误区与上岸攻略

12 月一到&#xff0c;今年的秋招就真的要收尾啦&#xff5e; 这段时间不少同学来跟我吐槽&#xff0c;说今年秋招太难&#xff0c;也有小伙伴晒出了满意的 offer&#xff0c;真是几家欢喜几家愁。作为陪着大家走过秋招的玖玖学长&#xff0c;今天就把整理的真实情况、薪资数据…

作者头像 李华
网站建设 2026/6/8 11:55:13

终极指南:如何用Ant Design X快速构建AI对话界面

终极指南&#xff1a;如何用Ant Design X快速构建AI对话界面 【免费下载链接】ant-design-x-vue Ant Design X For Vue.&#xff08;WIP&#xff09; 疯狂研发中&#x1f525; 项目地址: https://gitcode.com/gh_mirrors/an/ant-design-x-vue Ant Design X of Vue是一个…

作者头像 李华
网站建设 2026/6/8 9:19:03

VSCode+量子硬件日志分析(性能优化的隐藏入口)

第一章&#xff1a;VSCode 量子硬件的连接日志在现代量子计算开发中&#xff0c;使用集成开发环境&#xff08;IDE&#xff09;远程调试和连接真实量子设备已成为标准实践。Visual Studio Code&#xff08;VSCode&#xff09;凭借其强大的扩展系统&#xff0c;支持通过专用插件…

作者头像 李华