声音 UI框架 二

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值