using System;-----------声音框架---------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundManage : MonoBehaviour
{
//单例
public static SoundManage Instance;
//音乐播放器组件
private AudioSource _audioSource;
//音乐文件位置
public string ResourcesMusicDir="Audio";
public const string MUSICMUTE = "MusicMute";
public const string AUDIOMUTE = "AudioMute";
private void Awake()
{
Instance = this;
//场景加载时不销毁
DontDestroyOnLoad(gameObject);
_audioSource = GetComponent<AudioSource>();
//初始设置
_audioSource.loop = true;
_audioSource.playOnAwake = false;
if (PlayerPrefs.HasKey(MUSICMUTE))
{
MusicMute = PlayerPrefs.GetInt(MUSICMUTE)==0?false:true;
}
if (PlayerPrefs.HasKey(AUDIOMUTE))
{
AudioMute = PlayerPrefs.GetInt(AUDIOMUTE) ==0?false:true;
}
if (PlayerPrefs.HasKey("Vo"))
{
Volume = PlayerPrefs.GetFloat("Vo",Volume);
}
}
private void Start()
{
}
/// <summary>
/// 播放音乐
/// </summary>
/// <param name="musicName"></param>
public void PlayBgm(string musicName)
{
string path = ResourcesMusicDir + "/" + musicName;
_audioSource.clip= Resources.Load<AudioClip>(path);
_audioSource.Play();
}
/// <summary>
/// 停止播放
/// </summary>
public void StopBgm()
{
_audioSource.clip = null;
_audioSource.Stop();
}
/// <summary>
/// 音乐是否静音
/// </summary>
public bool MusicMute
{
get => _audioSource.mute;
set => _audioSource.mute = value;
}
/// <summary>
/// 音效是否静音
/// </summary>
public bool AudioMute
{
get;
set;
}
/// <summary>
/// 播放音效
/// </summary>
/// <param name="audioName"></param>
/// <param name="playPoint"></param>
public void PlayAudio(string audioName,Vector2 playPoint)
{
if (AudioMute==true) return;
string path = ResourcesMusicDir + "/" + audioName;
//指定播放路径
AudioClip ac= Resources.Load<AudioClip>(path);
AudioSource.PlayClipAtPoint(ac,playPoint);
}
//1调节增加音量2实现控制音量开关的功能
/// <summary>
/// 音量
/// </summary>
public float Volume
{
get
{
return _audioSource.volume;
}
set
{
_audioSource.volume = value;
}
}
}
using System;----------------UI框架*------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
public class UIManage : MonoBehaviour
{
//单例
public static UIManage Instance;
//存放UI面板的栈
public Stack<UIBase> _uiStack=new Stack<UIBase>();
//存放UI预设体的字典
private Dictionary<string,GameObject> _uiObject=new Dictionary<string, GameObject>();
//存脚本的字典
public Dictionary<string,UIBase> _uiBases=new Dictionary<string, UIBase>();
//预设体所在文件夹名称
public string resourcesUiPrefabDir = "UIPre";
private void Awake()
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
/// <summary>
/// 入栈-让当前界面显示
/// </summary>
/// <param name="uiName"></param>
public void PushUiPanel(string uiName)
{
if (_uiStack.Count>0)
{
//拿到原来的栈顶元素,暂停
UIBase oldTopUi= _uiStack.Peek();
oldTopUi.DoOnPause();
}
//得到新的ui面板
UIBase newTopUi= GetUiBase(uiName);
//当前的UI进入游戏
newTopUi.DoOnEnter();
//入栈
_uiStack.Push(newTopUi);
}
/// <summary>
/// 弹出UI
/// </summary>
public void PopUipanel()
{
//如果栈中没元素直接返回
if (_uiStack.Count==0) return;
//如果有元素,出栈且退出状态
UIBase oldTopUi = _uiStack.Pop();
oldTopUi.DoOnExit();
if (_uiStack.Count>0)
{
//如果一个UI出栈以后,下面还有UI,需要将UI状态恢复
UIBase newTopUi = _uiStack.Peek();
newTopUi.DoOnRestart();
}
}
/// <summary>
/// 根据名字得到UI面板
/// </summary>
/// <param name="uiName"></param>
private UIBase GetUiBase(string uiName)
{
//如果脚本字典里包含这个名字
if (_uiBases.ContainsKey(uiName))
{
return _uiBases[uiName];
}
//如果预设体字典中不包含该ui面板的预设体
if (!_uiObject.ContainsKey(uiName))
{
//去加载预设体资源
string uiPath = resourcesUiPrefabDir + "/" + uiName;
GameObject uiPrefab= Resources.Load<GameObject>(uiPath);
if (uiPrefab!=null)
{
//存入字典中
_uiObject[uiName] = uiPrefab;
}
else
{
Debug.Log("没这个资源");
return null;
}
}
//根据从字典中取出的预设体生成UI对象
GameObject uiObj= Instantiate(_uiObject[uiName]);
//赐名
uiObj.name = uiName;
//取当前对象的脚本组件
UIBase uiBase= uiObj.GetComponent<UIBase>();
//将脚本存到脚本字典中
_uiBases[uiName] = uiBase;
return uiBase;
}
public void Clear()
{
_uiStack.Clear();
_uiBases.Clear();
}
}
using System;-------根代码----
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameRoot : MonoBehaviour
{
//第一帧的时候跳转到开始场景
private void Start()
{
SceneManager.LoadScene(1);
}
}
using System.Collections.Generic;
using UnityEngine;------------基类------------
public class UIBase : MonoBehaviour
{
/// <summary>
/// 进入游戏
/// </summary>
public virtual void DoOnEnter()
{
}
/// <summary>
/// 暂停游戏
/// </summary>
public virtual void DoOnPause()
{
}
/// <summary>
/// 恢复游戏
/// </summary>
public virtual void DoOnRestart()
{
}
/// <summary>
/// 退出游戏
/// </summary>
public virtual void DoOnExit()
{
}
}
using System;------------开始----------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class UIStart : UIBase
{
public override void DoOnEnter()
{
gameObject.SetActive(true);
}
public override void DoOnPause()
{
gameObject.SetActive(false);
}
public override void DoOnRestart()
{
gameObject.SetActive(true);
SoundManage.Instance.PlayBgm("Audio_bgm_5");
}
public override void DoOnExit()
{
gameObject.SetActive(false);
}
private void Start()
{
Debug.Log("1");
SoundManage.Instance.PlayBgm("Audio_bgm_5");
gameObject.GetComponent<Canvas>().worldCamera= Camera.main;
}
public void LoadScene()
{
UIManage.Instance.Clear();
SceneManager.LoadScene(2);
}
/// <summary>
/// 选项按钮点击的事件
/// </summary>
public void GoToOption()
{
UIManage.Instance.PushUiPanel("UIOption");
}
}
-----------------选项--------------
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class UIOption : UIBase
{
private Slider _slider;
private Toggle _musicToggle;
private Toggle _audioToggle;
private void Awake()
{
//获取按钮
_musicToggle = transform.GetChild(0).GetChild(0).Find("Toggle_Music").GetComponent<Toggle>();
_audioToggle = transform.GetChild(0).GetChild(0).Find("Toggle_Audio").GetComponent<Toggle>();
//注册点击事件
_musicToggle.onValueChanged.AddListener(MusicToggleOnChange);
_audioToggle.onValueChanged.AddListener(AudioToggleOnChange);
//根据播放器更改按钮状态
_musicToggle.isOn = !SoundManage.Instance.MusicMute;
_audioToggle.isOn = !SoundManage.Instance.AudioMute;
}
private void Start()
{
_slider = GameObject.Find("Slider").transform.GetComponent<Slider>();
SoundManage.Instance.PlayBgm("Audio_bgm_6");
gameObject.GetComponent<Canvas>().worldCamera= Camera.main;
_slider.value = SoundManage.Instance.Volume;
}
public override void DoOnEnter()
{
gameObject.SetActive(true);
}
public override void DoOnPause()
{
gameObject.SetActive(false);
}
public override void DoOnRestart()
{
gameObject.SetActive(true);
}
public override void DoOnExit()
{
gameObject.SetActive(false);
}
private void Update()
{
SoundManage.Instance.Volume = _slider.value;
}
/// <summary>
/// 设置界面返回按钮的点击事件
/// </summary>
public void GoBack()
{
UIManage.Instance.PopUipanel();
}
/// <summary>
/// 音乐开关
/// </summary>
/// <param name="value"></param>
private void MusicToggleOnChange(bool value)
{
SoundManage.Instance.MusicMute = !value;
}
/// <summary>
/// 音效开关
/// </summary>
/// <param name="value"></param>
private void AudioToggleOnChange(bool value)
{
SoundManage.Instance.AudioMute = !value;
}
}