使用ScriptableObject进行序列化

原文地址 http://blog.sina.com.cn/s/blog_647422b90101d73s.html

如果你想创建不需要附加到游戏物体的对象,就可以使用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进行序列化_第1张图片

使用ScriptableObject进行序列化_第2张图片


其中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();
    }
}

你可能感兴趣的:(Unity3D)