AI技能标准化:构建学术写作的智能协作工作流
2026/5/12 21:44:33
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&¤tBackgroundMusic.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);}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);}}}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);}}}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);}}}创建一个AudioMixer并命名为"MainMixer",设置以下参数:
背景音乐:
方块音效:
UI音效:
道具音效:
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;}}