# 自定义资源

自定义资源可以用来保存开发者的游戏数据,一般用来存储一些全局唯一的数据。

自定义资源与在Prefab/Scene中的script Component保存数据不一样的是,Script Component虽然也可以通过@property去自定义落地保存编辑数据,但当 Prefab 和Scene被 Instantiate 多次,数据其实被多次创建,并且互不关联。当开发者希望减少内存,并且确定他们共享的是相同的数据的时候,可以使用自定义资源。自定义的资源和其他的小游戏资源一样在被 loader 加载后,都根据 uuid 生成一个全局单例。不论被任何的Prefab/Scene使用,都只共享一份资源实例。

创建自己的Scriptable Asset,在工具 Project 窗口,空白处右键新建 >> ScriptableAsset,会创建一个脚本模版。里面根据你的文件名定义了一个类。这时候再右键创建时,在列表中就会出现你刚刚创建的自定义资源的名字,创建后会看到一个 .asset 资源。这个资源内保存的数据结构,和Script Component一样,就是根据脚本中的@property来定义的。这时候开发者点击选中刚刚创建的.asset,去 Inspector 内就可以修改数据了。可以基于一个类创建多个 .asset 资源,并且各自有不同的数据。

@engine.decorators.CreateAssetMenu('saTest', 'saTest', 1)
@engine.decorators.serialize("saTest")
export default class saTest extends engine.ScriptableAsset {
  @engine.decorators.property({
    type: engine.TypeNames.String
  })
  public age: number = 10;
}

使用Scriptable Asset,开发者可以先创建一个Script Component,然后 import 刚刚创建的 ScriptableAsset 作为自己的@property的属性。这样就可以在编辑器里面看到有这样的UI,可以将刚刚创建的 .asset 资源设置进去。或是直接 loader.load 使用它。

import saTest from './saTest'

@engine.decorators.serialize("testScript")
export default class testScript extends engine.Script {
  @engine.decorators.property({
    type: saTest
  })
  public mySaTest: saTest
}