游戏开发日志13(利用PlayerPrefs来存储数据)

为游戏设置一个音量键,可以自由选择背景音乐是否开启,并且保存这个设置。

设计了UI如下:

游戏开发日志13(利用PlayerPrefs来存储数据)_第1张图片

其中BGM为Toggle,其余四个为Button 

游戏开发日志13(利用PlayerPrefs来存储数据)_第2张图片

 在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();
    }

    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():不推荐。用于在突发退出程序时,保存数据以备恢复时使用,但是会导致程序间断所以不建议

你可能感兴趣的:(unity数据储存,游戏开发日志,unity)