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