u3d ScriptableObject的簡單使用方法


ScriptableObject主要實現對象序列化的保存。

打包為資源后如下圖:

圖1

在u3d編輯器里,還可以手動修改數據,這個功能很直觀,可以當一個可視化的配置文件管理。

可視化編輯如下圖:

圖2

首先有一個繼承自ScriptableObject的類:

using UnityEngine;
using System.Collections.Generic;

[System.Serializable]
public class Test_ScriptObject : ScriptableObject
{
    public List<Vector4> m_szPoints = new List<Vector4>();
}

下面看如何創建asset資源:

[ContextMenu("CreatetScriptable")]
    void CreateTestScriptable()
    {
        DirectoryInfo info = new DirectoryInfo("Assets/Resources/CineAsset");
        if (!info.Exists)
        {
            info.Create();
        }

        string sFullName = Path.Combine("Assets/Resources/CineAsset", "PlaneCine.asset");

        Test_ScriptObject test_ScriptObject = ScriptableObject.CreateInstance<Test_ScriptObject>();
        test_ScriptObject.m_szPoints.Add(Vector4.zero);
        test_ScriptObject.m_szPoints.Add(Vector4.one);

        AssetDatabase.CreateAsset(test_ScriptObject, sFullName);
    }
//不是完整的類,需要using IO和UnityEditor包

這個功能主要是創建了一個Test_ScriptObject的實例化文件。打包完成后就如圖1所示。

下面看如何加載使用:

[ContextMenu("LoadAndUpdateScriptable")]
    void LoadAndUpdateScriptable()
    {

        Object oo = Resources.Load("CineAsset/PlaneCine");

        Test_ScriptObject test_ScriptObject = ScriptableObject.Instantiate(oo) as Test_ScriptObject;

        Debug.LogFormat("aaaaaaaaaaaaaa___{0}", test_ScriptObject.m_szPoints.Count);

        test_ScriptObject.m_szPoints.Clear();

        Debug.LogFormat("bbbbbbbbbbbbbb___{0}", test_ScriptObject.m_szPoints.Count);
    }

這是簡單從本地Resources加載的用例,當然也可以AssetBundle下載使用。

注意:加載出來是一個實力,可以復制很多份,就像材質一樣,所以在這里修改數據不會保存到PlaneCine.asset文件里。

至於如何修改PlaneCine.asset內的數據,我知道至少兩種方式:

1,直接在編輯器修改數據保存---圖2所示。

2.通過SerializedObject和SerializedProperty修改---具體的代碼會下載另外一篇里,這也是寫ScriptableObject之前用到的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM