返回介绍

ScriptableObject 脚本化对象

发布于 2019-12-18 15:38:31 字数 5161 浏览 1094 评论 0 收藏 0

Namespace: UnityEngine / Inherits from: Object

Description 描述

A class you can derive from if you want to create objects that don't need to be attached to game objects.

一个类能从想要创建的对象上获得,而不必附加到游戏对象上。

This is most useful for assets which are only meant to store data.

这意味着存储数据资源是最有用的。

To make it easy to create ScriptableObject instances that are bound to assets in your project, see CreateAssetMenuAttribute.

为了方便创建绑定到资源项目中ScriptableObject实例,参见CreateAssetMenuAttribute

Static Functions 静态函数

CreateInstanceCreates an instance of a scriptable object with className.
创建脚本化对象类名为className的一个实例。

Messages 消息

OnDestroyThis function is called when the scriptable object will be destroyed.
当脚本化对象将被销毁时,该函数被调用。
OnDisableThis function is called when the scriptable object goes out of scope.
当脚本化对象离开作用域时调用这个函数。
OnEnableThis function is called when the object is loaded.
当物体被加载的时候调用此函数。

示例:

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

通常用两种用法:

一、非打包方式

创建一个ScriptableObject脚本;

    using UnityEngine;   
 
    public class XMLContains : ScriptableObject       
    {   
 
        public string theXML;   
 
    }   

然后这样调用;

using UnityEngine;   
 
public class TieFighter : MonoBehaviour       
{       
    public XMLContainer myXMLSettings;   
 
    void Awake()           
    {   
    }    
}  

二、打包方式

1、先创建一个类:

    using UnityEngine;      
    using System.Collections.Generic;    
 
    public class SysData : ScriptableObject
    {                 
 
    public List<Vector3> content;   
 
    }  

该类只有一个属性content。当然也可以声明更多属性、事件和方法。 在后面,这个类的实例将作为资源被打包。

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

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

using UnityEditor;   
using System.Collections.Generic;    
 
public class Export      
{              
    [MenuItem("Assets/Export")]      
    public static void Execute()           
    {         
        //实例化SysData        
        SysData sd = ScriptableObject.CreateInstance<SysData>();                             
 
        //随便设置一些数据给content        
        sd.content = new List<Vector3>();         
        sd.content.Add(new Vector3(1,2,3));        
        sd.content.Add(new Vector3(4,5,6));   
 
        // SysData将创建为一个对象,这时在project面板上会看到这个对象        
        string p = "Assets/SysData.asset";         
        AssetDatabase.CreateAsset(sd, p);        
        Object o = AssetDatabase.LoadAssetAtPath(p, typeof(SysData));        
        //打包为SysData.assetbundle文件。        
        BuildPipeline.BuildAssetBundle(o, null, "SysData.assetbundle");        
        //删除面板上的那个临时对象        
        AssetDatabase.DeleteAsset(p);         
    }      
}   

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文