Unity Editor 編輯器擴展 四 ScriptableObject類定製可序列化數據

目錄

ScriptableObject類定製可序列化數據

這個類很有用,它可以打包數據對象,並且這個數據對象是序列化的,用來存儲數據非常方便,比json xml等更方便,容易存取,這裏用它做一個簡單的使用案例。

工具類ScriptableObjectUtility

打包工具類,需放到Editor文件夾內

using UnityEngine;
using UnityEditor;
using System.IO;

public static class ScriptableObjectUtility
{
    //  This makes it easy to create, name and place unique new ScriptableObject asset files.
    public static void CreateAsset<T> () where T : ScriptableObject
    {
        T asset = ScriptableObject.CreateInstance<T> ();

        string path = AssetDatabase.GetAssetPath (Selection.activeObject);
        if (path == "") 
        {
            path = "Assets";
        } 
        else if (Path.GetExtension (path) != "") 
        {
            path = path.Replace (Path.GetFileName (AssetDatabase.GetAssetPath (Selection.activeObject)), "");
        }

        string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath (path + "/New " + typeof(T).ToString() + ".asset");

        AssetDatabase.CreateAsset (asset, assetPathAndName);

        AssetDatabase.SaveAssets ();
        AssetDatabase.Refresh();
        EditorUtility.FocusProjectWindow ();
        Selection.activeObject = asset;
    }
}

創建一個可打包的數據類YouClass

using UnityEngine;
using System.Collections.Generic;

public class YourClass : ScriptableObject {
    public List<MyData> dialogue=new List<MyData>();
}

創建對應的數據類MyData

這個類中存儲你需要序列化存儲的打包數據

using UnityEngine;
using System.Collections;

[System.Serializable]
public class MyData{
    public enum sexual {male ,female};
    public string Name;
    public int age;
    public string dialogue;
    public AudioClip m_audio;

}

打包按鈕

加一句廢話,要放到Editor文件夾裏面

using UnityEngine;
using UnityEditor;

public class YourClassAsset
{
    [MenuItem("Assets/Create/YourClass")]
    public static void CreateAsset ()
    {
        ScriptableObjectUtility.CreateAsset<YourClass> ();
    }
}

生成數據文件

完成以上步驟,我們就可以打包了
這裏寫圖片描述

點擊YouClass按鈕就會生產如下文件
這裏寫圖片描述

這時我們可以看到,這個文件可以進行賦值操作的如下圖
這裏寫圖片描述

讀取數據

首先創建代碼如下,當然New YourClass文件要放到Resources文件夾下

using UnityEngine;
using System.Collections;

public class LoadClass : MonoBehaviour {
    void Start () {
        YourClass dia= Resources.Load ("New YourClass") as YourClass;
        for (int i = 0; i < dia.dialogue.Count; i++) {
            MyData data = dia.dialogue [i];
            Debug.Log (data.name+"---   "+data.age+"   :"+data.dialogue);
        }
    }

}

將這個腳本放到場景物體上運行Unity
這裏寫圖片描述
可以看到數據可以讀取啦。

本文工程:http://download.csdn.net/detail/warrenmondeville/9694660
本文連接:http://blog.csdn.net/warrenmondeville/article/details/53329038

發佈了31 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章