天天看點

Unity筆記之儲存Ugui的image的位置和大小資訊

目的:在通過按鍵調出調試界面後,可以移動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:用于本地持久化儲存與讀取的類。以鍵值對的形式将資料儲存在檔案中,然後程式可以根據這個名稱取出上次儲存的數值。

有以下幾種類型:

  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)判斷資料是否存在的方法;

最終選擇這個方法儲存資訊;

參考:Unity持久化存儲之PlayerPrefs的使用