CocosCreator3.8.x支持ScriptableObject了?

传送门: Cocos Store

ScriptableAsset

简介

提供和UnityScriptableObject的一样的功能

方便配置复杂结构的数据,方便协作,方便引用其他资源

和平时配置prefabcomponent数据一样,但不需要节点,不需要挂组件

测试的发布平台

H5 微信小游戏 Android原生 iOS原生 抖音小游戏 OPPO小游戏 vivo小游戏
:heavy_check_mark: :heavy_check_mark: :heavy_check_mark:

特性和规划

  • [x] 自定义ScriptableAsset类型

  • [x] 预览和编辑

  • [x] 拖拽赋值到组件字段(指定自定义ScriptableAsset类型)识别

  • [x] 使用装饰器添加右键创建按钮

  • [ ] 支持搜索

  • [ ] 支持自定义ScriptableAsset的Inspector

创建

自动添加到右键菜单,创建自定义类型数据文件

创建资源.gif

可视化修改配置

修改配置和修改Component的字段数据一样

可以使用任何CocosCreator提供的属性装饰器

修改资源.gif

参考更多用法:Cocos Creator 3.8 手册 - 装饰器使用

已知问题

  • 自定义且用ccclass装饰器的类,非继承Component的,比如CustomClasss,需要赋予初始值

引用和加载

和其他资源(cc.Prefab、cc.AudioClip、等)一样,进行引用和加载,以及对依赖资源加载,无需而外处理

被引用


import { _decorator, Component, Node } from 'cc';

import { bh } from 'db://scriptable-asset/scriptable_runtime';

import { CharSA } from './scripts/CharSA';

import { CharRender } from './scripts/CharRender';

const { ccclass, property } = _decorator;

@ccclass('TestRefScriptableAsset')

export class TestRefScriptableAsset extends Component {

    // private _charData: CharSA;

    // @property(bh.ScriptableAsset)

    // get charData(): CharSA{

    //     return this._charData;

    // };

    // set charData(value: CharSA){

    //     debugger

    //     this._charData = value;

    // }

    // @bh.scriptableAsset

    // charData: CharSA;

    @property(CharRender)

    charRender: CharRender;

    @property(CharSA)

    charData: CharSA;

    start() {

        console.log(this.charData.charName);

        this.charRender.setCharAsset(this.charData);

    }

    update(deltaTime: number) {

    }

}

界面

image.png

动态加载


import { _decorator, assetManager, Component, director, Node } from 'cc';

import { CharRender } from './CharRender';

import { CharSA } from './CharSA';

const { ccclass, property } = _decorator;

@ccclass('TestLoadScriptableAssetDynamic')

export class TestLoadScriptableAssetDynamic extends Component {

    /**

     *

   

    */

    @property(CharRender)

    charRender: CharRender = null;

    @property

    assetPath: string = "char/char_datas/CharSA"

    start() {

    }

    update(deltaTime: number) {

    }

    loadScriptableAsset() {

       

        assetManager.loadBundle('scriptable_asset_test_res', (err, bundle) => {

            if (err) {

                console.error(err);

                return;

            }

            bundle.load(this.assetPath, (err, asset:CharSA) => {

                if (err) {

                    console.error(err);

                    return;

                }

                console.log(asset);

                this.charRender.setCharAsset(asset);

            });

        });

    }

}

已知问题

  • 自定义且用ccclass装饰器的类,非继承Component的,比如CustomClasss,需要赋予初始值

  • 使用具体的ScriptableAsset类型会字段赋值旁边的打开搜索功能会搜索不到,需要使用基类ScriptableAsset作为字段装饰器类型,或者直接使用@bh.scriptableAsset来标记

    
    @bh.scriptableAsset
    
    charData: CharSA;
    
    
  • 删除ScriptableAsset脚本,会让依赖的地方显示为UnknownType,恢复脚本后,重启编辑器即可

  • 引擎版本>=3.8.0

其他作品

2赞

顶~

实际应用中好像还是喜欢excel+prefab的工作流多一点~~~ :rofl: :rofl: :rofl:

不过也为大佬点赞