创建储存系统,保存音乐值
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public static class SaveSystem
{
#region Prefs
//保存数据
public static void SaveByPlayerPrefs(string key, object data)
{
var josn = JsonUtility.ToJson(data, true);//将物体转为josn true方便人阅读
PlayerPrefs.SetString(key, josn);//注册数据
PlayerPrefs.Save();//保存在硬盘
}
//加载数据
public static string LoadForPlayerPrefs(string key)
{
return PlayerPrefs.GetString(key);//读取数据
}
#endregion
#region JSON
//储存数据
public static void SaveByJson(string saveFileName, object data)
{
var json = JsonUtility.ToJson(data);
var path = Path.Combine(Application.persistentDataPath, saveFileName);//unity中自带申请储存位置的函数 Application.persistentDataPath
try
{
Debug.Log($"susscessfully save data to {path}");
File.WriteAllText(path, json);//WriteAllText 创建文本 文件路径 文件内容 覆写内容
}
catch (System.Exception exception)//获取系统异常处理
{
#if UNITY_EDITOR//只在unity中运行
Debug.LogError($"Failed to save data to {path}.\n{exception}");
#endif
}
}
//加载数据
public static T LoadFromJson<T>(string saveFileName)
{
var path = Path.Combine(Application.persistentDataPath, saveFileName);//unity中自带申请储存位置的函数
try
{
var json = File.ReadAllText(path);//读取文件
var data = JsonUtility.FromJson<T>(json);//转化json文件数据
return data;
}
catch (System.Exception exception)//获取系统异常处理
{
#if UNITY_EDITOR//只在unity中运行
Debug.LogError($"Failed to load data from {path}.\n{exception}");
#endif
return default;
}
}
//删除数据
public static void DeleteSaveFile(string saveFileName)
{
var path = Path.Combine(Application.persistentDataPath, saveFileName);//unity中自带申请储存位置的函数
try
{
File.Delete(path);
}
catch (System.Exception exception)//获取系统异常处理
{
#if UNITY_EDITOR//只在unity中运行
Debug.LogError($"Failed to Delete data from {path}.\n{exception}");
#endif
}
}
//检查数据是否存在
public static bool SaveFileExists(string saveFileName)
{
var path = Path.Combine(Application.persistentDataPath, saveFileName);//unity中自带申请储存位置的函数
return File.Exists(path);//检查玩家数据是否存在
}
#endregion
}
再生成音乐音量控制类,挂载到有滑动条组件上
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
public class VolumeController : MonoBehaviour
{
public AudioSource audioSource; // 引用要控制音量的 AudioSource 组件
private UnityEngine.UI.Slider slider; // 引用 Slider 组件
private void Awake()
{
// 查找 Slider 组件
slider = GetComponent<UnityEngine.UI.Slider>();
}
private void Start()
{
audioSource.volume=LoadPlayerVolumeData().volume;
slider.value=LoadPlayerVolumeData().volume;
// 监听 Slider 的 onValueChanged 事件
slider.onValueChanged.AddListener(OnSliderValueChanged);
}
private void OnSliderValueChanged(float value)
{
// 将 Slider 的值映射到 0.0 到 1.0 的范围,并设置为音频的音量
audioSource.volume = slider.value;
UpdatePlayerVolumeData();
}
#region VolumeSave
[System.Serializable]
public class PlayerVolume//封装玩家数据
{
public float volume;
public PlayerVolume(float volume)//构造函数 构造函数的作用就是初始化一个新创建的对象,并在使用对象前设置对象的属性,也就是实例化;
{
this.volume = volume;
}
}
string SaveFileName = "player_volume.json";
//加载玩家数据
public PlayerVolume LoadPlayerVolumeData()
{
var playerScoreData = new PlayerVolume(audioSource.volume);
if (SaveSystem.SaveFileExists(SaveFileName))//是否有玩家数据
{
playerScoreData= SaveSystem.LoadFromJson<PlayerVolume>(SaveFileName);//读取数据
}
else
{
SaveSystem.SaveByJson(SaveFileName, playerScoreData);//保存数据
}
return playerScoreData;
}
//更新玩家数据和保存玩家数据
public PlayerVolume UpdatePlayerVolumeData()
{
var playerScoreData = new PlayerVolume(audioSource.volume);
SaveSystem.SaveByJson(SaveFileName, playerScoreData);//保存数据
return playerScoreData;
}
#endregion
}