【Unity】简单说说ScriptableObject

【Unity】简单说说ScriptableObject,第1张

很早就看到有这个东西了,但是一直没有去好好看,一看不知道,看了就爱上他了,真的是一个好用的东西。

用来存储数据的一个 资源文件 ,像是JSON、XML、文本文件这样的存储文件,可以用来存储数据。但是这里他在最开始的时候不需要再次读文件,就像是JSON在游戏开始时,我们需要加载JSON文件中的数据,我们就需要读取这个文件,然后在赋值给对象。他就可以直接使用其中的数据。因为他是资源文件,所以他有着资源文件的特性,我们ResourceLoad他就可以使用他了。
其实可以简单的理解为把你所有的数据都用变量在一个类中声明,然后我们使用的时候,直接实例化这个类就好了。

●他可以作为一个引用在脚本上,因为他是资源文件。
●不会被unity序列化机制影响,所以可以多场景共有。( 序列化文章 )
●在实例化对象时用它来做配置文件降低了内存的消耗
●有自己的回调OnEnable、OnDisable、OnDestroy。

用简单的例子来看看怎么用。

数据体类:

创建:

使用:

当然你也可以用菜单创建这个,如下:

今天就简单说说这个吧,其实他的用处和好处不仅仅是这么一点点,还有很多很多,今天就不一一说到了。
突然觉得这篇写的好水,虽然一直都好水。哈哈,见谅见谅。

脚本文件名称一定要与继承ScriptableObject的类名一样。不然会出现脚本为空的情况。

这样会导致你现在序列化存储的数据在,等你修改了场景或者打包的时候数据就不会存在了。就会出现下面这种情况。

如果你这个时候再次指定脚本为None,这个问题就解决了。但还是会想上一张图那样,但是数据就是一直序列化了,修改场景然后保存都不会出现第二张图的情况。
但是严谨的思维,还是把脚本文件名称一定要与继承ScriptableObject的类名弄成一样。这样的话那个script上就不是None,出错的概率会少一些。

Instantiate(m_rocket, m_transformposition,m_transformrotation);
创建一个预设物。m_rocket是预设物的名字, m_transformposition是预设物的位置,m_transformrotation旋转角度。
貌似可以这样:
GameObject go= (GameObject)Instantiate(flyswordon);//创建预设
gotransform position =new Vector3 (1 ,2,3);//重新摆放预设
gotransform Rotate (1,2,3 );//预设的旋转角
这样看好像清楚一点点。

你要创建什么对象?如果是unity3d中的物体那是可以的,如果是脚本,不好意思,没见过动态创建脚本的,因为unity3d与其他引擎最大的不同在于它的gameobject和脚本使用方式,unity3d中脚本生效是通过挂载在物体上实现的。
只能动态的将写好的脚本添加到物体上,无法动态的新建脚本
//给游戏物体添加名为FoobarScript的脚本
var fbs : FoobarScript;
fbs = gameObjectAddComponent(FoobarScript);
这是js写法
public FoobarScript fbs;
public void Awake() {
fbs = gameObjectAddComponent();
}

这是C#写法


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13408398.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存