目的:在通过按键调出调试界面后,可以移动ui上图片的位置,保存该位置信息,在下次运行程序时可以读取到。

一、想的是做一个配置表,经过搜索采用了生成.asset文件的方法,然后读取保存的.asset(事后证明此方法不好,在程序打包后,只能重新生成.asset文件来更新信息)

先贴上具体生成过程

先声明一个用于生成.asset文件的类

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public class Area : ScriptableObject
{
    public float Posx = 0;
    public float Posy = 0;

    public float Width = 0;
    public float Height = 0;
}

这个类用上面那个类生成.asset文件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
public class CreateAsset : MonoBehaviour
{
    /*// 在菜单栏创建功能项
    [MenuItem("Asset/CreateAsset")]*/
    public static void Create(string name)
    {
        // 实例化类  Area
        ScriptableObject area = ScriptableObject.CreateInstance<Area>();
        // 如果实例化 Bullet 类为空,返回
        if (!area)
        {
            Debug.LogWarning("area  not found");
            return;
        }
        // 自定义资源保存路径
        string path = Application.dataPath + "/Resources/AreaAeeets";
        // 如果项目不包含该路径,创建一个
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        //将类名 area 转换为字符串
        //拼接保存自定义资源(.asset) 路径
        path = string.Format("Assets/Resources/AreaAeeets/{0}.asset", (name));

#if UNITY_EDITOR
        // 生成自定义资源到指定路径
        AssetDatabase.CreateAsset(area, path);
        AssetDatabase.Refresh();
#endif
    }
    /// <summary>
    /// 读取asset文件
    /// </summary>
    //[MenuItem("Asset/GetAsset")]
    public static void GetAsset(string name)
    {
        /*#if UNITY_EDITOR
                //读取 .asset 文件, 直接转换为area类
                Area area = AssetDatabase.LoadAssetAtPath<Area>("Assets/Resources/AreaAeeets/"+name+".asset");
        #endif*/
        Area area = Resources.Load<Area>("AreaAeeets/" + name);
        Debug.Log(area.Width);
        Debug.Log(area.Height);
    }
    /// <summary>
    /// 设置asset数据
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <param name="width"></param>
    /// <param name="height"></param>
    public static void UpdatePos(string name,float x,float y)
    {
/*#if UNITY_EDITOR
        //读取.asset文件, 直接转换为area类
        Area area = AssetDatabase.LoadAssetAtPath<Area>("Assets/Resources/AreaAeeets/"+name+".asset");
#endif*/
        Area area = Resources.Load<Area>("AreaAeeets/" + name);
        if (area)
        {
            area.Posx = x; area.Posy = y;
        }
        else
        {
            CreateAsset.Create(name);
            CreateAsset.UpdatePos(name, x, y);
        }
        /*// 通知编辑器有资源被修改了
        EditorUtility.SetDirty(area);
        // 保存所有修改
        AssetDatabase.SaveAssets();*/
    }
    public static void UpdateWidth(string name, float width)
    {
/*#if UNITY_EDITOR
        //读取.asset文件, 直接转换为area类
        Area area = AssetDatabase.LoadAssetAtPath<Area>("Assets/Resources/AreaAeeets/" + name + ".asset");
#endif*/
        Area area = Resources.Load<Area>("AreaAeeets/" + name);
        if (area)
            area.Width = width;
        else
        {
            CreateAsset.Create(name);
            UpdateWidth(name, width);
        }
        /*// 通知编辑器有资源被修改了
        EditorUtility.SetDirty(area);
        // 保存所有修改
        AssetDatabase.SaveAssets();*/
    }
    public static void UpdateHeight(string name, float height)
    {
/*#if UNITY_EDITOR
        //读取.asset文件, 直接转换为area类
        Area area = AssetDatabase.LoadAssetAtPath<Area>("Assets/Resources/AreaAeeets/" + name + ".asset");
#endif*/
        Area area = Resources.Load<Area>("AreaAeeets/" + name);
        if (area)
            area.Height = height;
        else
        {
            CreateAsset.Create(name);
            UpdateHeight(name, height);
        }
        /*// 通知编辑器有资源被修改了
        EditorUtility.SetDirty(area);
        // 保存所有修改
        AssetDatabase.SaveAssets();*/
    }
}


二、因为上面的方法不好用,转而用另一个方法PlayerPrefs

PlayerPrefs:用于本地持久化保存与读取的类。以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值。

有以下几种类型:

  1. SetInt();保存整型数据;
  2. GetInt();读取整形数据;
  3. SetFloat();保存浮点型数据;
  4. GetFlost();读取浮点型数据;
  5. SetString();保存字符串型数据;
  6. GetString();读取字符串型数据;

使用直接使用就行

例如:

void CreatPlayerPrefs()
{
    //示例
    //声明了一个键为x,值为123的playerprefs
    string x
    PlayerPrefs.SetFloat(x, 123f);

    //实际上我项目里面使用的代码
    PlayerPrefs.SetFloat(play.name + "PosX", play.GetComponent<RectTransform>().anchoredPosition.x);

}

void float ReadPlayerprefs(string x)
{
    //实例
    //获取x对应的值,如果x为空则返回空值
    float y1=PlayerPrefs.getFloat(x);
    //获取x对应的值,如果x为空则返回12f;
    float y1=PlayerPrefs.getFloat(x,12f);
    
    return y1;

    //实际使用
 if(PlayerPrefs.HasKey(this.name+"PosX"))
    this.GetComponent<RectTransform>().anchoredPosition = new Vector2(PlayerPrefs.GetFloat(this.name + "PosX"), PlayerPrefs.GetFloat(this.name + "PosY"));
}

 

此外

还有api:

  • PlayerPrefs.DeleteKey (key : string)删除指定数据;
  • PlayerPrefs.DeleteAll() 删除全部键 ;
  • PlayerPrefs.HasKey (key : string)判断数据是否存在的方法;

最终选择这个方法保存信息;