述、属性及函数
首先提供官方参考文档:API-Reference-ScriptableObject & Scriptable-Manual & SctiptableObject-Candycat
概述: ScriptableObject类直接继承自Object类;它和MonoBehaviour是并列的,都继承自Object(但MonoBehaviour并不是直接继承自Object),会在后面介绍ScriptableObject和MonoBehavior的比较;
脚本化对象就是一个数据容器,可以用来存储大量的数据,它是可序列化的,这个特点也正决定了它的主要用途;一个主要用处就是通过将数据存储在ScriptableObject对象中来减少工程以及游戏运行时因拷贝值所造成的内存占用;
ScriptableObject与预制体:当你有一个预制体,它附加了一些mono脚本,包含了一些数据,每次我们实例化预制体的时候它都会拷贝assets下原预制体的值生成一份自己的拷贝,然后我们可以修改场景内预制体的值而并不影响assets下预制体的值,这是prefab的特性,对于我们从一个prefab模板生成属性不同的游戏对象是很有用的,但是如果prefab里的脚本数据是不需要修改的,它就会造成很大的资源浪费,尤其在数据很多的时候;为了避免这种问题,我们可以在不需要修改prefab里的脚本数据时,考虑使用ScriptableObject来存储这些重复的数据,然后其它所有预制体都可以使用引用的方式来访问这份数据,这就意味着不管场景中实例了多少预制体,在内存中就只需要有一份数据;它所带给我们的启示就是,当预制体中的脚本里有大量重复数据时,我们要想着将数据抽离,单独保存在本地;
举一个子弹的例子,这是一个比较典型的例子,因为一个子弹会包含很多属性,而且在场景中需要大量的实例化,我们要先做一个子弹的预制体,为了体现它的属性,我们会写一个派生自MonoBehaviour的脚本Bullet,在里面添加一些属性,然后将其附加到一个子弹游戏对象上,完成了一个子弹预制体的制作;之后我们在场景中实例化新的子弹的时候,这个实例也会有一个Bullet实例,而且最重要的是这些子弹都会有这样一份Bullet而且它们的数据是相同的,这就是之前讲到的因为拷贝值产生新的实例导致了大量的内存占用;这个时候我们就可以把这个派生自MonoBehaviour的脚本里的数据放置在派生自ScriptableObject的脚本,然后就可以在创建Assets下创建一份数据文件,设置完数据后,在Bullet中我们就定义一个指向ScriptableOjbect对象的引用,这样它就由原来的拷贝大量值并存储重复的值变成了拷贝一个引用并存储一个引用;
应用场景及方式:当使用编辑器运行游戏的时候,可以将数据保存到ScriptableObject里(当创建一个脚本化对象实例后使用AssetDatabase.CreateAsset()保存该资源),退出之后也不会丢失,因为它是作为Assets下的资源存在的;它是仅在编辑器中才可以保存修改的数据(因为ScriptableObject对象虽然声明在UnityEngine中,但是它的Scriptable是通过UnityEditor命名空间下的类例如Editor类等来实现的),所以在部署构建的时候不可以用于存储游戏运行时更改的数据,但是可以使用之前存储好的数据,也就是ScriptableObject生成的数据资源文件在Editor外具有只读属性,这是非常需要注意的一点,如果你需要在游戏中修改数据并存储下来,就不推荐使用ScriptableObject了;
总结:它就是用来在编辑器模式下保存和存储数据到本地Assets下的,数据保存以后是可以共享的,就像纹理、shader等资源一样,是可以共享于当前整个工程和其它工程的;这个ScriptableObject在真机上不可修改的,就像我们不可以在游戏运行时修改一个shader资源的代码、不可以修改一个纹理资源的像素内容一样,而在Unity Editor里可以修改ScriptableObject是因为Unity的编辑器对它格式的支持,就像使用vs code修改shader和使用ps修改一张纹理一样;
属性
name:返回对象的名称
静态方法
CreateInstance:在游戏运行时创建一个Scriptable类型的实例,不使用时被GC回收;
//静态方法,使用了ScriptableObject类约束的泛型参数T
public static T CreateInstance<T>() where T : ScriptableObject;
Instantiate:实例化一个对象,返回一个实例;类似于GameObject的Instantiate(),其它函数也和GameObject类似;
public static T Instantiate(T original);
public static T Instantiate(T original, Transform parent);
public static T Instantiate(T original, Transform parent, bool worldPositionStays);
public static T Instantiate(T original, Vector3 position, Quaternion rotation);
public static T Instantiate(T original, Vector3 position, Quaternion rotation, Transform parent);
Parameters
Message:ScriptableObject内部实现上也继承自MonoBehavior,它只有四个消息函数,Awake()、OnDestroy()、OnEnable()、OnDisable();
二、ScriptableObject与MonoBehaviour
1.两个类都是继承自Ojbect类
首先看一下MonoBehaviour类:
ScriptableObject对象是不可以作为组件附加到对象上的,因为它的出现就是为了要让数据独立于具体的游戏对象;
2.ScriptableObject对象拥有非常少的回调函数
Awake():创建一个对象实例时调用;
OnEnable():如下,创建或被加载时调用;
OnDisable / OnDestroy:当调用销毁函数时,
如果想仔细了解ScriptableObject的回调函数何时调用,可以自己定义一个ScriptableObject对象,然后在四个回调函数中加上相应的Debug.Log()即可;
三、案例使用
1.简单应用:创建Scriptable实例与保存到文件资源
我们已经知道我们在开发中如何去使用脚本化对象了,回顾一下:
第一种:在游戏运行时创建脚本化对象实例,然后可以将数据保存到本地(如果不保存,它会在游戏结束后销毁);
第二种:在代码中引用Assets文件夹下的脚本化对象资源(也许是从游戏运行时保存下来的数据,也许是手动创建的数据);
使用案例:游戏配置文件;商品清单;敌人统计数据等;
2.CreateAssetMenuAttribute-使用ScriptableObject
命名空间在UnityEngine的一个特性,它有三个属性filename,menuname,order,它用于标记一个派生自Scriptable的类,可以在Assets下的create下添加子菜单项,用于创建.asset资源文件(Scriptable类是和.asset资源关联的);它和AddComponentMenu特性类似,只不过后者是将脚本组件添加到组件按钮的子菜单项,Unity中提供了很多用于编辑器菜单项扩展的属性例如MenuItem、ContextMenu等等,我们往往根据它的名称就可以大概知道它用在什么地方;
注意:虽然使用MenuItem也可以在Assets/Create下创建一个菜单项,但是两种方式还是有区别;
如果是使用MenuItem在静态方法中调用CreateAsset创建资源,那么需要指定创建的目录和资源名称,如果资源已经存在,则不会创建新资源;而CreateAssetMenu则可以在Assets下任意目录创建资源,而且可以创建多个资源;
public class MakeScriptableObject {
[MenuItem("Assets/Create/My Scriptable Object")]
public static void CreateMyAsset()
{
MyScriptableObjectClass asset = ScriptableObject.CreateInstance<MyScriptableObjectClass>();
AssetDatabase.CreateAsset(asset, "Assets/NewScripableObject.asset");
AssetDatabase.SaveAssets();
EditorUtility.FocusProjectWindow();
Selection.activeObject = asset;
}
}
[CreateAssetMenu(fileName = "data", menuName = "ScriptableObjects/SpawnManagerScriptableObject", order = 1)]
public class SpawnManagerScriptableObject : ScriptableObject {
public string prefabName;
public int numberOfPrefabsToCreate;
public Vector3[] spawnPoints;
}
然后,在Assets下创建一个可编程对象资源,设置好所需数据;如果需要在其它脚本中获取该数据,是需要声明一个该类型变量,然后为其赋值或加载该数据资源;然后,就像使用用一个类中的公有变量一样使用即可;
public SpawnManagerScriptableObject spawnManagerValues;
//spawnManagerValues.prefabName
提示:可以使用CustomEditor来为ScriptableOjbect创建自定义属性面板;
3.ScriptableObject与Json
打开CSDN,阅读体验更佳
Unity ScriptableObject序列化对象用法
Unity ScriptableObject序列化对象的简单用法,包含了怎么定义、创建、加载一个序列化对象
unity2020 webgl 加载配置文件 ScriptableObject 和StreamingAssets
一、使用ScriptableObject:(优点:unity自带无需配置,缺点:打包后无法在进行修改) 建议项目初期,配置项目数据相关的数值参数。便于新项目或策划修改。 1.创建配置文件相关的类型 using System; using System.Collections.Generic; using UnityEngine; public class Student : ScriptableObject { public List<StudentInfo> Clients=new
浏览器打开
评论(1)
写评论
查看全部评论
Zaswind码龄2年
感谢2021.09.26
Unity3D之ScriptableObject学习笔记_yuyingwin的专栏
在Unity3D中,我们记录游戏的配置数据可以使用文件文件(XML、JSON等格式),也可以使用二进制文件(自定义格式),两种方式都需要自己进行解析,而Unity比较贴心,为我们提供了另外一种格式的数据记录方式,就是ScriptableObject。
Unity3D ScriptableObject 简要介绍_宁静致远
http://blog.u3dgames.cn/unity/2017-01/Unity-ScriptableObject.html 关于Unity3d的数据持久化,或者叫序列化,除了自己实现自定义格式的配置文件和存取逻辑外,更便捷的方式是使用Unity内置的序列化机制。大家都知道,我们在脚本(MonoBehavio...
Unity3D 学习笔记5 ——使用ScriptableObject进行序列化
ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法 [csharp] view plain copy prin
浏览器打开
【Unity】ScriptableObject的使用以及通过代码的加载与保存方式
官方地址:https://docs.unity3d.com/2018.4/Documentation/Manual/class-ScriptableObject.html
浏览器打开
【Unity】ScriptableObject的介绍_candycat_scriptable...
我竟然最近两天才知道Unity中ScriptableObject的存在…… 看了下ScriptableObject的一些介绍,最大的优点感觉有三点: 把数据真正存储在了资源文件中,可以像其他资源那样管理它,例如退出运行也一样会保持修改 ...
unity2020 webgl 加载配置文件 ScriptableObject 和Str...
一、使用ScriptableObject:(优点:unity自带无需配置,缺点:打包后无法在进行修改) 建议项目初期,配置项目数据相关的数值参数。便于新项目或策划修改。 1.创建配置文件相关的类型 usingSystem;usingSystem.Collections.Generic;usingUnityEngine;...
【Unity】ScriptableObject 序列化游戏数据/保存数据到本地
游戏中经常会有一些需要序列化的数据,通常的做法就是把这些数据 [SerializeField],然后在视图面板中修改数值,这样不需要修改脚本,就可以进行数据调整,方便策划大大修改数值。 不过这样做还有一个缺点,因为序列化的数据都保存在Scene场景内,没修改一次数值,场景文件(Scene.unity)都会随之变动,多人合作时,场景文件就很容易发生冲突。在这里就给大家简单介绍一下利用Scripta...
浏览器打开
热门推荐 【Unity】ScriptableObject的介绍
写在前面我竟然最近两天才知道Unity中ScriptableObject的存在……看了下ScriptableObject的一些介绍,最大的优点感觉有三点: 把数据真正存储在了资源文件中,可以像其他资源那样管理它,例如退出运行也一样会保持修改 可以在项目之间很好的复用,不用再制作Prefab那样导入导出 在概念上有很好的fit,强迫症患者的福音 看了下感觉有很多东西都可以用它。之前的做法一般都是[Se
浏览器打开
【Unity】ScriptableObject 序列化游戏数据/保存数据到...
在这里使用Resources加载的Asset文件,也可以通过AB加载等方式,或者直接序列化GameData 类都可。 加载到ScriptableObject类之后,就可以使用里面的属性啦 using System.Collections; using System.Collections.Generic; using UnityEngine; public...
【Unity】ScriptableObject的使用以及通过代码的加载与保存方式
第一步:创建ScriptableObject脚本 usingUnityEngine; // 右键菜单 [CreateAssetMenu(menuName ="ScriptableObjects/CreateCubeScriptableObject")] publicclassCubeScriptableObject:ScriptableObject
scriptableobject类理解
ScriptableObject是一个数据容器,它可以用来保存大量数据,主要的用处就是在项目中通过将数据存储在ScriptableObject对象,避免值拷贝来减少游戏运行中的内存占用。 当你有一个预制体,上面挂了一个存有不变数据的MonoBehaviour 脚本时,每次我们实例化预制体时都将产生一次数据拷贝,这时我们可以使用ScriptableObject对象来存储数据,然后通过引用来访问预制...
浏览器打开
ScriptableObject 的使用
ScriptableObject 的一些特点: ScriptableObject 数据存储在 asset 资源文件中,相当于被持久化,类似 unity 材质或纹理资源,如果在运行时改变了它的值则就是真的改变了并被持久化下来ScriptableObject 资源在实例化时是被引用,而非像 Prefab 或其他 GameObject一样是复制(实际场景中会存在多个 GameObject)
浏览器打开
Unity3D 学习笔记5 ——使用ScriptableObject进行序列...
ScriptableObject:经常用于存储一些unity3d本身不能打包的对象(object),比如:字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包或者.assets文件供后续使用。 接下来我们通过一个简单的实例来展示如何使用Scrip...
Unity Editor扩展入门(4) ScriptableObject_xdestiny11...
日文原文地址:http://anchan828.github.io/editor-manual/web/scriptableobject.html。 渣翻,有些东西相当不确定,禁止转载 4.1 ScriptableObject是什么 ScriptableObject是一个用于生成单独Asset的结构。同时,它也能被称为是Unity中用于处理...
【Unity】ScriptableObject的基本介绍
转载:【Unity】ScriptableObject的介绍 —— CSDN 简述 最近对unity提供的ScriptableObject比较感兴趣,想了解一下这方面的技术知识。故此参考网上的学习资料总结一遍。 ScriptableObject的好处 将游戏数据存储在了资源文件中,能够在游戏退出后依然保持这一份游戏数据。 能依赖继承实现很好的复用关系。 个人觉得第一点是非常好的理念,让游戏的数据存储变得更加的优雅便捷。同时能够实现高复用,来适应多个不同的使用场景。 解决的问题 运行时为了保存数据,基本依
浏览器打开
Uinty ScriptableObject的用法
ScriptableObject允许你存储大量用于公用的数据,可以理解成是Uinty的一个串行化工具,但要和SerializableObject区分开来(只能在Editor下使用)。例如,一个游戏中的配置表数据,这些数据一般都是由策划在Excel等工具上配置,要运用到游戏中时,一般都需要做一个转换,以适应程序中的访问。这时可以使用ScriptableObject,将数据预先处理成我们需要访问的数据
浏览器打开
Unity Editor扩展:ScriptableObject简记_天富儿的博客...
ScriptableObject是一个用于生成单独Asset的结构。同时,它也能被称为是Unity中用于处理序列化的结构。 在Unity里面有单独的序列化结构,所有的Object(UnityEngine.Object)都能够通过这个方法进行数据的序列化与反序列化。文件和Unity编辑器都...
Unity3D之ScriptableObject学习笔记
不同与C#提供的Serializable序列化功能,ScriptableObject是Unity3D提供的一个数据存储类,我们接下来学习一下这个类的功能。 官方文档 http://docs.unity3d.com/Manual/class-ScriptableObject.html http://docs.unity3d.com/ScriptReference/ScriptableObjec...
浏览器打开
ScriptableObject.zip
一个关于Unity的ScriptableObject类的简要小例子,作为记录!
最新发布 Unity(二十三):ScriptableObject - 把数据存储到资源文件中
创建Asset资源 - ScriptableObject Assets\Editor\Create_ScriptableObject.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class Create_ScriptableObject { [MenuItem("Assets/Create/CreateAsset", fal
浏览器打开
Unity Editor扩展入门(4) ScriptableObject
Unity Editor扩展入门(4) ScriptableObject Translated by Xdestiny 2018/3/17 日文原文地址:http://anchan828.github.io/editor-manual/web/scriptableobject.html。 渣翻,有些东西相当不确定,禁止转载 4.1 ScriptableObject是什么 Scrip...
浏览器打开
ScriptableObject的用法
ScriptableObject允许你存储大量用于公用的数据,可以理解成是Uinty的一个串行化工具,但要和SerializableObject区分开来(只能在Editor下使用)。例如,一个游戏中的配置表数据,这些数据一般都是由策划在Excel等工具上配置,要运用到游戏中时,一般都需要做一个转换,以适应程序中的访问。这时可以使用ScriptableObject,将数据预先处理成我们需要访问的数据
浏览器打开
Unity3D ScriptableObject 简要介绍
http://blog.u3dgames.cn/unity/2017-01/Unity-ScriptableObject.html 关于Unity3d的数据持久化,或者叫序列化,除了自己实现自定义格式的配置文件和存取逻辑外,更便捷的方式是使用Unity内置的序列化机制。大家都知道,我们在脚本(MonoBehaviour)中定义的公共变量或被标记为【SerializeField】的私有
浏览器打开
Unity 数据存储方式之一:ScriptableObject
ScriptableObject: 最常用的功能就是背包系统的实现,ScriptableObject的特点是在游戏结束后,数据不会清除,依旧会保留游戏中产生的数据。所以可以利用这一点来做背包系统 什么是ScriptableObject: 查阅Unity官方手册解释成为ScriptableObject是一个数据容器,可用于保存大量数据,而与类实例无关。ScriptableObjects的主要用例之一是通过避免复制值来减少项目的内存使用量 就像MonoBehaviours一样,ScriptableObj.
浏览器打开
ScriptableObject的理解
1.一种真正的资源文件,就像texture,sprite一样; 2.不用依托于inspecter上的物体,可以独立存在。 3.作为资源的集合,如,把id,名字,图片绑在一起,作为一个集合; 4.可视化。 然后和一般类比较: 一般的类也不需要依托于inspecter上的物体,本身也可以独立存在,也可以作为资源的集合,唯一的小小的缺点就是非可视化。而可视化的好处在于方便配置参数和方便观测,但是配置参数这一点可以通过在excel配置再转json完成;一般类在观测上确实有点麻烦。 如何使用Scr..
浏览器打开
Unity ScriptableObject初探
开发游戏的过程中,经常会遇到数据的存取,例如,技能信息,人物信息,物品信息等等。通常的做法就是使用序列化,反序列化的方式例如,xml,json,二进制构造器。但是这些方式对策划来说是不友好的,而且如果我们在unity编辑器模式下运行,修改后的值一旦停止运行就会恢复原样。还有一点就是我们需要使数据唯一性(只有一份数据)。Unity意识到了这一点,于是给我们提供了ScriptableObject数据容器
浏览器打开
unity 加载scriptableobject |