当前位置: 首页 > news >正文

游戏音效脚本添加

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脚本
http://www.cnnetsun.cn/news/105291.html

相关文章:

  • mpv.net媒体播放器使用指南:打造极致观影体验的完整教程
  • 实战指南:零基础构建智能对话数字人Live2D系统
  • 基于Python+django的大学生自习室预约系统
  • 如何快速掌握Obsidian标题自动编号:笔记爱好者的完整指南
  • VSCode端口映射避坑指南(99%新手都会忽略的关键细节)
  • 终极越狱教程:iPhone 7完美解锁iOS 15+系统权限
  • 26、UNIX与Linux系统的安全、卸载及其他实用知识
  • 终极指南:5步构建企业级Next.js仪表板认证系统
  • rclone云存储配置全攻略:从零基础到高效数据同步专家
  • 效率翻倍的秘密:VSCode量子编程中必须掌握的5大核心快捷键
  • 从卡顿到秒级响应,VSCode量子模拟器调优全记录,开发者必看
  • Oracle:拼音码
  • 【前端工程师必看】Vercel AI SDK在Docker中无法响应?这7种解决方案你必须掌握
  • AI模型上线即被攻击?只因跳过了这3步Docker权限验证
  • VAP动画引擎深度解析:从技术原理到行业最佳实践的终极指南
  • AlphaPose实战宝典:5大核心技术掌握多人姿态估计算法
  • B站视频下载神器:BiliDownloader完整使用教程
  • 年底电商大促攻坚战:DooTask如何成为业绩冲刺的“秘密武器”?
  • 26、深入探究文件操作与库I/O函数
  • 29、SH编程与EXT2文件系统详解
  • 揭秘企业级Agent日志难题:如何用Docker日志快速定位生产事故根源
  • 【Cirq实战优化秘籍】:3步配置函数提示提升编码速度200%
  • 免费压缩工具7-Zip:让硬盘空间管理变得如此简单
  • .NET Windows Desktop Runtime 终极指南:快速构建现代化Windows应用
  • Quartz定时任务集成使用指南:从基础到实战
  • 【量子计算入门必备技能】:如何在VSCode中高效搭建并管理Qiskit项目?
  • 35岁被大厂裁员,我却靠这三大“狠招”半年后涨薪50%再战字节!
  • 【专家级调试技巧】:如何在Azure QDK中实现精准断点控制?
  • 思源宋体WOFF2压缩优化:算法原理与工程实践深度解析
  • GLSL PathTracer 项目全面深度解析:架构、原理与核心技术