如果你想创建不需要附加到游戏物体的对象,就可以使用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();
}
}