news 2026/4/17 12:50:39

游戏音效脚本添加

作者头像

张小明

前端开发工程师

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/4/16 19:46:09

Hooks-Admin终极指南:基于React18的现代化后台管理系统完整教程

Hooks-Admin终极指南&#xff1a;基于React18的现代化后台管理系统完整教程 【免费下载链接】Hooks-Admin &#x1f680;&#x1f680;&#x1f680; Hooks Admin&#xff0c;基于 React18、React-Router V6、React-Hooks、Redux、TypeScript、Vite2、Ant-Design 开源的一套后台…

作者头像 李华
网站建设 2026/4/17 18:25:36

mpv.net播放器终极指南:解决你所有视频播放痛点的完美方案

还在为视频播放器卡顿、界面老旧、功能单一而烦恼吗&#xff1f;mpv.net这款基于mpv的Windows平台媒体播放器&#xff0c;用现代化界面和高性能播放引擎&#xff0c;彻底解决你的观影困扰。&#x1f3ac; 【免费下载链接】mpv.net &#x1f39e; mpv.net is a media player for…

作者头像 李华
网站建设 2026/4/17 3:59:37

低代码开发平台靠谱吗?它的出现对企业有哪些好处?

一、什么是低代码开发平台&#xff1f;低代码开发平台&#xff08;Low-Code Development Platform&#xff0c;LCDP&#xff09;是一种基于图形化界面与模型驱动架构的应用开发工具集&#xff0c;核心特征在于通过对传统编码流程的抽象化、组件化封装&#xff0c;最大限度降低手…

作者头像 李华
网站建设 2026/4/17 4:06:32

ReadCat电子书阅读器:重新定义数字阅读的终极指南

ReadCat电子书阅读器&#xff1a;重新定义数字阅读的终极指南 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat 你是否曾经为市面上电子书阅读器的复杂界面和繁琐操作感到困扰&#xf…

作者头像 李华
网站建设 2026/4/13 6:38:32

MegSpot终极教程:10分钟掌握图片视频对比神器

MegSpot终极教程&#xff1a;10分钟掌握图片视频对比神器 【免费下载链接】MegSpot MegSpot是一款高效、专业、跨平台的图片&视频对比应用 项目地址: https://gitcode.com/gh_mirrors/me/MegSpot MegSpot是一款高效、专业、跨平台的图片与视频对比应用&#xff0c;作…

作者头像 李华