关于 importer 的时序问题

在 3.8.7 的公测贴中 首次提出 问题

在 3.8.7 的正式版中没有得到有效结局。

我怀疑是 时序 问题

在公司的电脑上定制import后有如下日志:

lazy register asset handler *
lazy register asset handler directory
lazy register asset handler text
lazy register asset handler json
lazy register asset handler auto-atlas
lazy register asset handler label-atlas
lazy register asset handler render-pipeline
// 省略...
lazy register asset handler render-stage
lazy register asset handler render-flow
lazy register asset handler instantiation-material
lazy register asset handler instantiation-mesh
lazy register asset handler instantiation-skeleton
lazy register asset handler instantiation-animation
lazy register asset handler video-clip

可以很明显的看到没有我的扩展的 importer

在 日志不远处可以 找到这样一条日志:Can not find the importer game-beginners-tutorial in editor

game-beginners-tutorial 也就是我的扩展 importer

采用 3.8.x 最新的importer 语法:

"script": "./dist/importer/index.js",
"asset-handler": [
  {
         "handler": "registerBeginnerTutorialImporter",
          name": "game-beginners-tutorial",
          extnames": [
               ".beginner"
           ]
      }
]

采用了最新的设计

import { Asset } from "@cocos/creator-types/editor/packages/asset-db/@types/protected";
import type { AssetHandler } from "@cocos/creator-types/editor/packages/asset-db/@types/protected/asset-handler";
import { join } from "path";
import { PACKAGE_JSON } from "../editor/utils";
import { BeginnersAsset } from "../editor/beginners-asset";

module.paths.push(join(Editor.App.path, 'node_modules'));

const handler = {
    name: "game-beginners-tutorial",
    extends: 'json',
    assetType: "cc.JsonAsset",
    iconInfo: {
        default: {
            type: 'image',
            value: 'packages://game-beginners-tutorial/static/asset-icon.png',
        },
    },

    async open(asset: Asset): Promise<boolean> {
         // .. do something
        return true;
    },

    importer: {
        version: PACKAGE_JSON.version,
        migrations: [],
        async before(asset: Asset) {
             // .. do something
            return true;
        },

        async after(asset: Asset) {
            // .. do something
            return true;
        },
    },
} as AssetHandler;
export default handler;

前面说在好的电脑上,会出现Can not find the importer game-beginners-tutorial in editor
但是在旧的很菜的电脑上则不会出现该问题。

如果现在在好的电脑上,也就是出现问题的电脑上,刷新 资源(构建)调试工具。你会发现日志便成了这样:

lazy register asset handler *
lazy register asset handler directory
lazy register asset handler text
lazy register asset handler json
lazy register asset handler spine-data
//... 省略
lazy register asset handler instantiation-mesh
lazy register asset handler instantiation-skeleton
lazy register asset handler instantiation-animation
lazy register asset handler video-clip
// 多了次条日志
lazy register asset handler game-beginners-tutorial

日志里面多了这条:

lazy register asset handler game-beginners-tutorial

此时检测插件逻辑,一切都是正常的。

希望在 3.8.8 里面修复这个importer注册时序问题。

1赞

我们并没有公开这个用法哦,这个功能还没有正式对外,目前也存在一些还没有解决的问题,后续支持的时候会解决遇到的问题。

没关系,正常能跑就行。总不至于将来给删掉吧?关键我没办法做个延迟初始化什么的,总不能每次打开编辑器都刷新一下 资源(构建)调试工具。主要问题是旧的3.8.0的import语法也不好使。关键是除了这个,也找不到其他的可以定制一些内容不一致的资源的方法。

何为内容不一致,即在asset下资源内容是a(编辑器数据),但是打包后资源内容是b(运行时数据)。

目前对我的述求而已,只需要能正常注册就行。至少我没有遇到其他额外的BUG。

你好 这个用法是怎么用的?可以扩展自定义资源么

是的,可以的