7.开始场景-设置界面
7.1 拼面板
查看设置界面示例图
把canvas预制体拉一个出来,创建设置面板对象,面板中创建背景图,标题,关闭按钮,两个多选框,两个拖动条。注意调整锚点。
7.2 音乐相关
下载音乐资源,拖入工程中
查看数据管理类和音乐数据类类图
创建MusicData音乐数据结构类脚本,添加背景音乐和音效的开关和大小变量
/// <summary>
/// 音乐数据结构类
/// </summary>
public class MusicData
{
//背景音乐和音效的开关
public bool musicOpen = true;
public bool soundOpen = true;
//背景音乐和音效的大小
public float musicValue = 0.2f;
public float soundValue = 0.2f;
}
创建GameDataMgr游戏数据管理器类脚本,搞成单例
/// <summary>
/// 专门用来管理数据的类
/// </summary>
public class GameDataMgr
{
private static GameDataMgr instance = new GameDataMgr();
public static GameDataMgr Instance => instance;
}
GameDataMgr脚本中关联一个音乐数据类变量,在构造函数中用Json数据管理器读取,提供给外部存储音乐数据的方法,用Json数据管理器存储。
//音效相关数据
public MusicData musicData;
private GameDataMgr()
{
//初始化一些默认数据
musicData = JsonMgr.Instance.LoadData<MusicData>("MusicData");
}
/// <summary>
/// 存储音效数据
/// </summary>
public void SaveMusicData()
{
JsonMgr.Instance.SaveData(musicData, "MusicData");
}
创建背景音乐对象BKMusic,创建一个BKMusic脚本继承MonoBehaviour并挂载,再挂载一个音乐源组件
BKMusic脚本中,类中定义了一个静态实例 instance 和一个静态属性 Instacne,用于访问唯一的实例。声明了一个私有的 AudioSource 类型变量 bkSource,用于控制音频的播放和属性设置。在 Awake() 方法中进行初始化操作,将当前实例赋值给 instance,保证只有一个实例存在。获取当前对象(脚本所附加的游戏对象)上的 AudioSource 组件,并将其赋值给 bkSource 变量。通过访问全局的游戏数据管理器 GameDataMgr 来获取音乐相关的数据,然后根据这些数据设置背景音乐的开关和音量。提供用于开关背景音乐的公共方法SetIsOpen(bool isOpen),通过设置 bkSource.mute 属性来实现。提供用于调整背景音乐的大小的公共方法ChangeValue(float v),通过设置 bkSource.volume 属性来实现。
public class BKMusic : MonoBehaviour
{
private static BKMusic instance;
public static BKMusic Instacne => instance;
private AudioSource bkSource;
void Awake()
{
instance = this;
bkSource = this.GetComponent<AudioSource>();
//通过数据 来设置 音乐的大小和开关
MusicData data = GameDataMgr.Instance.musicData;
SetIsOpen(data.musicOpen);
ChangeValue(data.musicValue);
}
//开关背景音乐的方法
public void SetIsOpen(bool isOpen)
{
bkSource.mute = !isOpen;
}
//调整被背景音乐大小的方法
public void ChangeValue(float v)
{
bkSource.volume = v;
}
}
7.3 功能制作
创建SettingPanel脚本,继承BasePanel面板基类,挂载到SettingPanel设置界面预制体上,注意脚本名要和界面名一样。定义关闭按钮,音乐、音效多选框,音乐、音效滑动条变量。外部关联。重写了 Init() 方法,获取全局的游戏数据管理器 GameDataMgr 中的音乐相关数据。根据音乐数据初始化音乐音效多选框控件的状态和滑动条控件的取值。为关闭按钮添加点击事件监听,当关闭面板时,调用游戏数据管理器类保存数据,并隐藏设置面板。为音乐开关添加值改变事件监听,当音乐开关状态发生改变时,调用 BKMusic.Instacne.SetIsOpen(v) 方法来控制背景音乐的开关,记录开关数据到游戏数据管理器的音乐数据变量中。为音效开关添加值改变事件监听,当音效开关状态发生改变时,记录开关数据到游戏数据管理器的音乐数据变量中。为音乐滑动条添加值改变事件监听,当音乐滑动条数值发生改变时,调用 BKMusic.Instacne.ChangeValue(v) 方法来设置背景音乐的大小,同时记录音乐大小数据到游戏数据管理器的音乐数据变量中。为音效滑动条添加值改变事件的监听器。当音效滑动条数值发生改变时,记录音效大小数据到游戏数据管理器的音乐数据变量中。
public class SettingPanel : BasePanel
{
//关闭按钮
public Button btnClose;
//音乐、音效多选框
public Toggle togMusic;
public Toggle togSound;
//音乐、音效滑动条变量
public Slider sliderMusic;
public Slider sliderSound;
public override void Init()
{
//初始化面板显示内容 根据本地存储的设置数据来初始化
MusicData data = GameDataMgr.Instance.musicData;
//初始化开关控件的状态
togMusic.isOn = data.musicOpen;
togSound.isOn = data.soundOpen;
//初始化拖动条控件的大小
sliderMusic.value = data.musicValue;
sliderSound.value = data.soundValue;
btnClose.onClick.AddListener(() =>
{
//为了节约性能 只有当设置完成后 关闭面板时 才会去记录数据 真正的写到硬盘上(文件中)
GameDataMgr.Instance.SaveMusicData();
//隐藏自己 隐藏设置面板
UIManager.Instance.HidePanel<SettingPanel>();
});
togMusic.onValueChanged.AddListener((v) =>
{
//让背景音乐进行开关
BKMusic.Instacne.SetIsOpen(v);
//记录开关的数据
GameDataMgr.Instance.musicData.musicOpen = v;
});
togSound.onValueChanged.AddListener((v) =>
{
//记录音效的开关数据
GameDataMgr.Instance.musicData.soundOpen = v;
});
sliderMusic.onValueChanged.AddListener((v) =>
{
//让背景音乐大小改变
BKMusic.Instacne.ChangeValue(v);
//记录被背景音乐大小数据
GameDataMgr.Instance.musicData.musicValue = v;
});
sliderSound.onValueChanged.AddListener((v) =>
{
//记录音效大小的数据
GameDataMgr.Instance.musicData.soundValue = v;
});
}
}
把设置界面预制体放到Resources文件夹做成预制体
7.4 代码
MusicData
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 音乐数据结构类
/// </summary>
public class MusicData
{
//背景音乐和音效的开关
public bool musicOpen = true;
public bool soundOpen = true;
//背景音乐和音效的大小
public float musicValue = 0.2f;
public float soundValue = 0.2f;
}
GameDataMgr
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 专门用来管理数据的类
/// </summary>
public class GameDataMgr
{
private static GameDataMgr instance = new GameDataMgr();
public static GameDataMgr Instance => instance;
//音效相关数据
public MusicData musicData;
private GameDataMgr()
{
//初始化一些默认数据
musicData = JsonMgr.Instance.LoadData<MusicData>("MusicData");
}
/// <summary>
/// 存储音效数据
/// </summary>
public void SaveMusicData()
{
JsonMgr.Instance.SaveData(musicData, "MusicData");
}
}
BKMusic
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BKMusic : MonoBehaviour
{
private static BKMusic instance;
public static BKMusic Instacne => instance;
private AudioSource bkSource;
void Awake()
{
instance = this;
bkSource = this.GetComponent<AudioSource>();
//通过数据 来设置 音乐的大小和开关
MusicData data = GameDataMgr.Instance.musicData;
SetIsOpen(data.musicOpen);
ChangeValue(data.musicValue);
}
//开关背景音乐的方法
public void SetIsOpen(bool isOpen)
{
bkSource.mute = !isOpen;
}
//调整被背景音乐大小的方法
public void ChangeValue(float v)
{
bkSource.volume = v;
}
}
SettingPanel
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SettingPanel : BasePanel
{
public Button btnClose;
public Toggle togMusic;
public Toggle togSound;
public Slider sliderMusic;
public Slider sliderSound;
public override void Init()
{
//初始化面板显示内容 根据本地存储的设置数据来初始化
MusicData data = GameDataMgr.Instance.musicData;
//初始化开关控件的状态
togMusic.isOn = data.musicOpen;
togSound.isOn = data.soundOpen;
//初始化拖动条控件的大小
sliderMusic.value = data.musicValue;
sliderSound.value = data.soundValue;
btnClose.onClick.AddListener(() =>
{
//为了节约性能 只有当设置完成后 关闭面板时 才会去记录数据 真正的写到硬盘上(文件中)
GameDataMgr.Instance.SaveMusicData();
//隐藏自己 隐藏设置面板
UIManager.Instance.HidePanel<SettingPanel>();
});
togMusic.onValueChanged.AddListener((v) =>
{
//让背景音乐进行开关
BKMusic.Instacne.SetIsOpen(v);
//记录开关的数据
GameDataMgr.Instance.musicData.musicOpen = v;
});
togSound.onValueChanged.AddListener((v) =>
{
//记录音效的开关数据
GameDataMgr.Instance.musicData.soundOpen = v;
});
sliderMusic.onValueChanged.AddListener((v) =>
{
//让背景音乐大小改变
BKMusic.Instacne.ChangeValue(v);
//记录被背景音乐大小数据
GameDataMgr.Instance.musicData.musicValue = v;
});
sliderSound.onValueChanged.AddListener((v) =>
{
//记录音效大小的数据
GameDataMgr.Instance.musicData.soundValue = v;
});
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com