如何在Unity3D中使用ScriptableObject进行序列化
发表于2017-07-14
如果你想创建不需要附加到游戏物体的对象,就可以使用ScriptableObject这个类,下面就教大家如何在Unity3D中使用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)”序列化”为文件了,两个文件中前者可以直接编辑数据而后者不能.我们可以根据需要使用不同的文件。
其中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(); } }