首页 > 其他分享 >在Unity3D中使用ScriptableObject进行序列化

在Unity3D中使用ScriptableObject进行序列化

时间:2023-07-13 19:32:39浏览次数:50  
标签:Unity3D ScriptableObject class using SysData 序列化 public 打包


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. "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. new List<Vector3>();                 
24.   
25. new Vector3(1,2,3));                 
26.   
27. new Vector3(4,5,6));                              
28.   
29. // SysData将创建为一个对象,这时在project面板上会看到这个对象。                 
30.   
31. string p = "Assets/SysData.asset";           
32.   
33.     AssetDatabase.CreateAsset(sd, p);                 
34.   
35. typeof(SysData));                              
36.   
37. //打包为SysData.assetbundle文件。                 
38.   
39. null, "SysData.assetbundle");                 
40.   
41. //删除面板上的那个临时对象               
42.   
43.      AssetDatabase.DeleteAsset(p);                        
44.   
45.   }   
46.   
47. }   
48.   
49.

 

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


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


     

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

    标签:Unity3D,ScriptableObject,class,using,SysData,序列化,public,打包
    From: https://blog.51cto.com/u_1044274/6715589

    相关文章

    • unity3D制作并使用Assetbundles方法
      在网页中为了控制.unity文件的大小,加速载入速度,可以把系统用到的资源制作成Assestbundles,根据需要进行动态的加载和卸载。具体作法:1、使用脚本重新定义系统菜单,添加一个制作Assetbunles的菜单命令://C#Example//Buildsanassetbundlefromtheselected......
    • Java反序列化:URLDNS的反序列化调试分析
      URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。一.Java反序列化前置知识Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的writerObject方法实现Serializable接口,将对象转化成字节......
    • 解决redis hash序列化报错的具体操作步骤
      RedisHash序列化报错的解决方法1.问题背景在使用Redis时,有时候会遇到Hash序列化报错的问题。这种问题通常是由于Redis中存储的数据类型与操作的数据类型不一致导致的。在下面的文章中,我将为你详细介绍解决这个问题的步骤和相应的代码示例。2.解决步骤步骤操作1.查......
    • Unity3D_根据不同的屏幕缩放UI(在横屏上运行竖屏软件)
      一、首先我们创建一个1080*1920分辨率的场景 效果如下二、随便添加一张UI图片三、打包出来看效果(我们发现UI显示不全,这是因为UI的尺寸任然是1080*1920,而我们的电脑是1920*1080) 四、我们在Unity中做以下设置1.选中游戏物体Canvas2.点击组件CanvasScaler上的UISc......
    • Unity3D 游戏实战开发之英雄联盟
      本次游戏项目为类dota游戏中的经典之作《英雄联盟》,向经典致敬。通过本次课程,你会学到网游开发模式、C#服务器开发、协议定制、Unity5.0新特性开发、UGUI应用、同步方案、解决问题思路、各种扩展工具的开发………! 演示地址:www.runruncode.com/video-game/19444.html ......
    • Unity3D高级编程主程手记 学习笔记五:网络通讯
      1.C#实现TCP1.1实现所需APIC#提供了TCP的Socket连接API。一般的游戏项目我们不会使用阻塞方式连接和接收。因为我们不会让游戏卡住等待传输链接,大多数情况下我们还是会使用更加平滑的异步操作作为网络连接和收发的操作。常用的API如下:BeginConnect:开始连接Be......
    • go语言序列化和反序列化
      序列化需求内存中的map、slice、array以及各种对象,如何保存到一个文件中?如果是自己定义的结构体的实例,如何保存到一个文件中?如何从文件中读取数据,并让它们在内存中再次恢复成自己对应的类型的实例?要设计一套协议,按照某种规则,把内存中数据保存到文件中。文件是一个字节序列,所......
    • web中间件漏洞之(3)fastjson反序列化漏洞
      引言fastjson可以将Java对象序列化为json格式,也可将json反序列化为Java对象。在请求包里面中发送恶意的json格式payload,fastjson在处理json对象时使用了autotype机制,允许在反序列化时通过@type指定反序列化的类,调用指定类的set和get方法。攻击者可以通过rmi或ldap服务,将ldap......
    • Unity3D如何在一个项目建多个场景
      推荐:将NSDT场景编辑器加入你的3D工具链3D工具集:NSDT简石数字孪生设置多个场景您可以添加多个场景、编辑查看场景的方式以及更改场景设置。要创建新场景,请参阅创建、加载和保存场景。添加场景有两种方法可以向项目添加新场景:*右键单击以在“项目”窗口中打开场景资源的菜单......
    • 序列化的高级用法之source
      一、可以取别名book_name=serializers.CharField(source='name')book_name为前端可以看到的字段值,name是对象真实的属性。注意:别名和真实属性不能相同二、可以跨表关联查询publish_name=serializers.CharField(source='publish.name')必须有关联关系,book模型和publis......