`
vanadiumlin
  • 浏览: 504919 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在Unity3D中使用ScriptableObject进行序列化

 
阅读更多

ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法

  1. using UnityEngine;   
  2.   
  3. public class XMLContains : ScriptableObject   
  4.   
  5. {   
  6.   
  7.     public string theXML;   
  8.   
  9. }   



By making your class enherit from ScriptableObject, it becomes an "Asset Type" to unity, in the sense that you can store them on disk, and use the Unity IDE interface to drag it from the assetsfolder to a behaviour or whatever. It also automatically plays nice with Unity's dependency tracking system that decides what does and what does not go into a webplayer. Going a bit further with this example, you could have let's say a TieFighter class, actually get some of its information (max health, max speed, acceleration), from your xml file, by making the TieFighter class look like this:
 

  1. using UnityEngine;   
  2.   
  3. public class TieFighter : MonoBehaviour   
  4.   
  5. {   
  6.   
  7.      public XMLContainer myXMLSettings;   
  8.   
  9.    
  10.   
  11.      void Awake()   
  12.   
  13.      {   
  14.   
  15.         //parse myXMLSettings.theXML into reasonable data   
  16.   
  17.      }   
  18.   
  19.    
  20.   
  21.      void Update()   
  22.   
  23.      {   
  24.   
  25.         //use the reasonable data   
  26.   
  27.      }   
  28.   
  29.  }  


 

You could then attach the TieFighter script to a gameobject, and then drag your xml-asset from your assetsfolder onto the myXMLSettings public field.Please note that this example is much better at showing how you could use a ScriptableObject than how to properly implement a TieFighter, as I would never really have that parse an actual xml file on runtime. Tiefighters are too cool for xml anyway.
以上是不做成bundle包的形式,下面提供了一种打包成bundle资源,通过www来进行载入的方案:

通常,可以用BuildPipeline.BuildAssetBundle打包资源,这些资源包括模型、纹理、贴图等。其实也可以打包ScriptableObject,而ScriptableObject中可以存储任何数据类型。

以下为一个完整示例。

 

1、先创建一个类:

  1. using UnityEngine;   
  2.   
  3. using System.Collections.Generic;    
  4.   
  5. public class SysData : ScriptableObject   
  6.   
  7. {                 
  8.   
  9. public List<Vector3> content;   
  10.   
  11. }  


 

该类只有一个属性content。当然也可以声明更多属性、事件和方法。

在后面,这个类的实例将作为资源被打包。

 

2、创建一个编辑器脚本:

该脚本用于实例化SysData,设置一些数据,然后打包。

 

  1. using UnityEngine;   
  2.   
  3. using UnityEditor;   
  4.   
  5. using System.Collections.Generic;    
  6.   
  7. public class Export  
  8.   
  9. {          
  10.   
  11.   [MenuItem("Assets/Export")]           
  12.   
  13.   public static void Execute()   
  14.   
  15.   {                
  16.   
  17.    //实例化SysData               
  18.   
  19.    SysData sd = ScriptableObject.CreateInstance<SysData>();                             
  20.   
  21.     //随便设置一些数据给content                 
  22.   
  23.     sd.content = new List<Vector3>();                 
  24.   
  25.     sd.content.Add(new Vector3(1,2,3));                 
  26.   
  27.     sd.content.Add(new Vector3(4,5,6));                              
  28.   
  29.     // SysData将创建为一个对象,这时在project面板上会看到这个对象。                 
  30.   
  31.     string p = "Assets/SysData.asset";           
  32.   
  33.     AssetDatabase.CreateAsset(sd, p);                 
  34.   
  35.     Object o = AssetDatabase.LoadAssetAtPath(p, typeof(SysData));                              
  36.   
  37.     //打包为SysData.assetbundle文件。                 
  38.   
  39.     BuildPipeline.BuildAssetBundle(o, null"SysData.assetbundle");                 
  40.   
  41.     //删除面板上的那个临时对象               
  42.   
  43.      AssetDatabase.DeleteAsset(p);                        
  44.   
  45.   }   
  46.   
  47. }   
  48.   
  49.    

 

3、运行时加载这个数据资源。

  1. IEnumerator Start ()   
  2. {                
  3.  WWW www = new WWW("file://" + Application.dataPath + "/../SysData.assetbundle");                
  4.  yield return www;    
  5.                
  6.  //转换资源为SysData,这个sd对象将拥有原来在编辑器中设置的数据。                
  7.  SysData sd = www.assetBundle.mainAsset as SysData;   
  8.  //如打印sd.content[0],将得到Vector3(1,2,3);               
  9.  print(sd.content[0]);  
  10. }  


 

4、这其实是把整个对象实例打包,如果ScriptableObject属性中包括其他的类实例,则这些类需加上[Serializable]序列化。通过这种方法,可以将系统需要的数据(如角色分类、matrix4x4数据等等)打包,加载后直接转换为预定的类型,具有更高的效率。

分享到:
评论

相关推荐

    unity3d-ordered-dictionary:用于将有序字典添加到自定义`ScriptableObject`和`MonoBehaviour`类的库,只要键和值类型可序列化,可通过Unity对其进行序列化

    用于在自定义ScriptableObject和MonoBehaviour类中添加有序词典的库,只要键和值类型是可序列化的,就可以由Unity进行序列化。 $ yarn add rotorz/unity3d-ordered-dictionary 该软件包与工具兼容。 有关将程序​...

    Unity Obfuscator Pro插件

    专为 Unity 设计的Obfuscator Pro考虑了 Unity 的独特特性,如 MonoBehaviours、ScriptableObjects、序列化和反射,为您提供了一个强大但简单且开箱即用的混淆器。 Obfuscator Pro功能包括: - 会员更名: -&gt; ...

    Unity的EXCEL.rar

    2. **数据序列化**:Unity支持数据序列化,这意味着Excel中的数据可以被转化为Unity对象并保存在项目中。这种序列化机制使得数据可以在游戏运行时加载和保存。 3. **Unity的ScriptableObject**:ScriptableObject是...

    EasySave3.0.7z unity很多人使用的 数据保存插件

    - **灵活的数据类型**:不仅支持基本的C#数据类型(如int、float、string),还支持Unity的GameObject、Prefab、ScriptableObject等复杂对象的保存。 - **序列化与反序列化**:自动处理数据的序列化与反序列化过程...

    CeShiJsonDemo.zip

    通过NPOI库处理Excel文件,结合Json.NET库进行数据的序列化和反序列化,我们可以方便地在Unity中管理和使用结构化数据。这种技术在游戏开发中有着广泛的应用,无论是数据管理还是用户界面的动态更新,都能发挥重要...

    FsUnityExtensions:用F#编写的Unity3d编辑器扩展的集合

    - **脚本ableObject扩展**:F#可能用于增强ScriptableObject的使用,提供更高级的序列化和数据管理功能。 - **编辑器工具**:利用F#的特性,可能包含了一些便捷的编辑器工具,如资源查找、代码生成、性能分析等。 - ...

    Card Select.rar

    在Unity中,我们可以使用ScriptableObject来创建自定义的数据资产,它们可以在项目中被引用,且易于管理和编辑。 接下来是卡牌显示逻辑。Unity的UI系统,如Canvas和Image组件,可以用来创建卡牌的用户界面。我们...

    Unity高度集成2D开发环境——ex2D2

    ex2D的独特之处在于其遵循Unity的工作流程,利用ScriptableObject来存储和管理2D数据,如精灵图集、动画和字体。这种数据结构可以方便地在多个组件之间共享,提高了资源利用率,并简化了大型项目的管理。此外,ex2D...

    十方游戏

    C#可以配合各种AI框架,如Unity的Behavior Trees或Scriptable Object,创建复杂的决策系统。 8. **音效和音乐管理**:C#可以调用Unity或其他音频库,处理游戏中的声音效果和背景音乐。 总的来说,【十方游戏】的...

Global site tag (gtag.js) - Google Analytics