在Unity3D中使用ScriptableObject进行序列化

如果你想创建不需要附加到游戏物体的对象,就可以使用ScriptableObject这个类。

ScriptableObject一般用来存储u3d无法打包的对象(object),利用它可以将对象打包为assetbundle或者.assets文件以供后续使用。总体来看这也是一个很好的序列化方法。

1.首先需要创建一个类,必须继承自ScriptableObject

Test.cs:

using UnityEngine;

public class Test : ScriptableObject

{

   public string testString;

   public int testInt;

   public Vector3 testVector3;

   public AudioClip testAudioClip;

   public GameObject testGameObject;

 

   public void PrintTest()

   {

       Debug.Log("This is a test class!");

   }

}

 

2.创建一个编辑器脚本,用来对此类的实例进行打包
TestEditor.cs:

using UnityEngine;

#if UNITY_EDITOR

using UnityEditor;

#endif

using System.Collections.Generic;

public class TestEditor
{
    #if UNITY_EDITOR
    [MenuItem("Assets/Export Test Object")]

    public static void Execute()
    {
       Test  test = ScriptableObject.CreateInstance();//创建Test的一个实例
       //设置一些参数
       test.testString = "Test String";

       //创建资源文件,这时会在监视面板中看到并且可以直接编辑数据啦!!!!
       AssetDatabase.CreateAsset(test , "Assets/TestAsset.asset" );
       AssetDatabase.Refresh();

       //我们还可以创建资源包
       Object o = AssetDatabase.LoadAssetAtPath("Assets/TestAsset.asset", typeof(Test));
       BuildPipeline.BuildAssetBundle(o, null, "TestAssetBundle.unity3d");
       AssetDatabase.Refresh();

       //到此我们已经创建了名为“TestAsset”的资源文件了,需要用到的时候有三种方法:

      //1.编辑器环境下使用的话可以用Test o = AssetDatabase.LoadAssetAtPath(path , typeof(Test));将此资源文件“反序列化"为一个类对象,从而可以进行后续操作

     //2.运行时使用可以将该资源文件放到Resources文件夹下,并通过Test o = Resourecs.Load("TestAsset",typeof(Test)) as Test; 也可以通过WWW来 加载,详细请参考Unity3DAPI

     //我们还可以将其打包为asset,BuildPipeline.BuildAssetBundle(test, null, "TestAsset.assetbundle");若如此则只能通过WWW来加载

    }
   #endif
}

3.上边我们已将创建了TestAsset.asset和TestAssetBundle.unity3d两个文件,相当于我们将Test类的一个实例(Object)”序列化”为文件了,两个文件中前者可以直接编辑数据而后者不能.我们可以根据需要使用不同的文件。

使用ScriptableObject进行序列化

使用ScriptableObject进行序列化

其中TestAssetBundle.unity3d只能在运行时(runtime)使用,并且只能通过WWW加载
TestAsset.asset既可以在运行时(runtime)也可以再编辑器环境下使用。运行时可以通过Resources.Load来加载但是资源文件必须放在Resources文件夹下,编辑器环境下可以通过AssetDatabase.LoadAssetAtPath或者Resources.LoadAssetAtPath来加载
下面仅仅给出利用WWW加载TestAssetBundle.unity3d的脚本
创建脚本LoadFileTest.cs

using UnityEngine;
using System.Collections;

public class LoadFileTest:MonoBehaviour
{
    IEnumerator Start ()
    {
      WWW www = new WWW("file://" Application.dataPath "/../TestAssetBundle.unity3d");
      yield return www;
      //转换资源为Test,这个test对象将拥有原来在编辑器中设置的数据。
      Test test = www.assetBundle.mainAsset as Test;
      test.PrintTest();
    }
}

1 Reply to “在Unity3D中使用ScriptableObject进行序列化”

发表评论