目的:在通過按鍵調出調試界面後,可以移動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();*/
}
}
更詳細的看:Unity 使用自定義資源(.asset)配置資料
二、因為上面的方法不好用,轉而用另一個方法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)判斷資料是否存在的方法;
最終選擇這個方法儲存資訊;
參考:Unity持久化存儲之PlayerPrefs的使用