为游戏设置一个音量键,可以自由选择背景音乐是否开启,并且保存这个设置。
设计了UI如下:
其中BGM为Toggle,其余四个为Button
在canvas(set)上添加两个脚本:GameMnue,GameManage
public class GameManage : MonoBehaviour
{
public static GameManage instance;
public bool IsPaused;
private void Awake() {
if(instance==null)
{
instance=this;
}else{
if(instance!=this)
{
Destroy(gameObject);
}
}
DontDestroyOnLoad(gameObject);
}
}
public class GameMnue : MonoBehaviour
{
public Image gameMenuImage;
public Toggle BGMToggle;
public AudioSource BGMSource;
public void Start() {
gameMenuImage.gameObject.SetActive(false);
}
public void Update() {
if(Input.GetKeyDown(KeyCode.Escape))
{
if(GameManage.instance.IsPaused)
{
Resume();
}
else
{
Pause();
}
}
BGMManage();
}
public void Resume()
{
gameMenuImage.gameObject.SetActive(false);
Time.timeScale=1;
GameManage.instance.IsPaused=false;
}
private void Pause()
{
gameMenuImage.gameObject.SetActive(true);
Time.timeScale=0.0f;
GameManage.instance.IsPaused=true;
}
public void BGMToggleBUtton()
{
if(BGMToggle.isOn)
{
PlayerPrefs.SetInt("BGM",1);
}
else{
PlayerPrefs.SetInt("BGM",0);
}
}
private void BGMManage()
{
if(PlayerPrefs.GetInt("BGM")==1)
{
BGMToggle.isOn=true;
BGMSource.enabled=true;
}else if(PlayerPrefs.GetInt("BGM")==0)
{
BGMToggle.isOn=false;
BGMSource.enabled=false;
}
}
其中PlayerPrefs这个静态类,可以通过键值对来存储整数,如PlayerPrefs.SetInt("BGM",0)中,BGM为键名,0为要存入键的值。
类似的,我还存储了一个物品的数量信息,及主角的位置信息:
public class GameMnue : MonoBehaviour
{
public Image gameMenuImage;
public Toggle BGMToggle;
public AudioSource BGMSource;
public GoodsItem projectile;
public RubbyController rubby;
public Vector2 position;
public void Start() {
gameMenuImage.gameObject.SetActive(false);
rubby=FindObjectOfType<RubbyController>();
}
public void Update() {
if(Input.GetKeyDown(KeyCode.Escape))
{
if(GameManage.instance.IsPaused)
{
Resume();
}
else
{
Pause();
}
}
BGMManage();
}
public void Resume()
{
gameMenuImage.gameObject.SetActive(false);
Time.timeScale=1;
GameManage.instance.IsPaused=false;
}
private void Pause()
{
gameMenuImage.gameObject.SetActive(true);
Time.timeScale=0.0f;
GameManage.instance.IsPaused=true;
}
public void BGMToggleBUtton()
{
if(BGMToggle.isOn)
{
PlayerPrefs.SetInt("BGM",1);
}
else{
PlayerPrefs.SetInt("BGM",0);
}
}
private void BGMManage()
{
if(PlayerPrefs.GetInt("BGM")==1)
{
BGMToggle.isOn=true;
BGMSource.enabled=true;
}else if(PlayerPrefs.GetInt("BGM")==0)
{
BGMToggle.isOn=false;
BGMSource.enabled=false;
}
}
public void SaveButton()
{
SaveByPlayerprefs();
}
public void LoadButton()
{
LoadByPlayerprefs();
}
public void SaveByPlayerprefs()
{
PlayerPrefs.SetInt("projectile",projectile.itemHeld);
PlayerPrefs.SetFloat("PlayerPosX",rubby.transform.position.x);
PlayerPrefs.SetFloat("PlayerPosY",rubby.transform.position.y);
}
public void LoadByPlayerprefs()
{
projectile.itemHeld=PlayerPrefs.GetInt("projectile");
InventoryManage.RefreshItem();
position.x=PlayerPrefs.GetFloat("PlayerPosX");
position.y=PlayerPrefs.GetFloat("PlayerPosY");
rubby.transform.position=new Vector2(position.x,position.y);
}
}
这里使用rubby.transform.position=new Vector2(position.x,position.y);来修改位置信息是个不错的选择,因为rubby.transform.position是不能被修改的。
保存方法:PlayerPrefs.SetInt(“key”, value);//SetFloat和SetString也可以
读取方法:PlayerPrefs.GetInt(“key”)//GetFloat和GetString也可以
删除所有数据方法:PlayerPrefs.DeletAll()
删除单一数据:PlayerPrefs.DeleteKey(“keyA”)//删除key为“keyA”的数据
安全校验:PlayerPrefs.HasKey(“keyB”)//返回key为“keyB”的数据,不存在的话返回默认值0
PlayerPrefs.Save():不推荐。用于在突发退出程序时,保存数据以备恢复时使用,但是会导致程序间断所以不建议