目的:在通过按键调出调试界面后,可以移动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:用于本地持久化保存与读取的类。以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值。
有以下几种类型:
- SetInt();保存整型数据;
- GetInt();读取整形数据;
- SetFloat();保存浮点型数据;
- GetFlost();读取浮点型数据;
- SetString();保存字符串型数据;
- 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)判断数据是否存在的方法;
最终选择这个方法保存信息;