Prefab 如何用代码创建

我想用代码直接创建 cc.Prefab 对象,然后通过 cc.instantiate 实例化预制对象 , 而不是 拖动到组建上在实例话, 请问该如何实现。

1赞

你好 你可以在官方范例中找到assets/cases/05_scripting/02_prefab/InstantiatePrefab.fire这个场景,它演示了cc.instantiate的用法

1赞

LZ想问的不是cc.instantiate的用法
而是如何用脚本创建prefab
@zzf_2025

好的 那参考下这个例子吧 URL:assets/cases/05_scripting/07_asset_loading/LoadRes.fire

loadPrefab: function () {
        var url = this._url[1];
        this._releaseResource(url, cc.Prefab);
        cc.loader.loadRes(url, cc.Prefab, (err, prefab) => {
            this._removeAllChildren();
            cc.loader.setAutoRelease(prefab, true);
            var node = cc.instantiate(prefab);
            this.content.addChild(node);
            node.position = cc.v2(0, 0);
        });
    },
3赞

这个也只是怎么加载prefab吧。。
都不是如何用代码脚本创建prefab
大佬是太忙了所以没细看么

预制都需要自己先创建的,用代码实例化

为啥舍近求远,直接创建node就好了,node可以用cc.instantiate 实例化

我觉得Editor api最好支持代码创建prefab,node, 挂载脚本等功能。这样好方便做扩展,例如直接通过脚本取psd图层信息,生成prefab,自动布局界面

@337031709 考虑一下我的建议

同感,非常需要这样的功能,让策划选定资源就能自己做预制了
以前unity都是这样做的。用拖拖拖的方法太浪费时间还容易出错

:2:

Editor api最好支持代码创建prefab,已经可以了啊,我现在就是这样搞的

先自己创建保存在目录,然后加载 再实例出来。
你想直接创建预设?那你还是直接创建节点玩吧
洗洗睡了亲

你贴点代码出来看,我上次看了一下editor api,好像没有相关接口

加油啊,向团队内部反映一下我的建议

贴出来方便一下大家

/**
 * @param {string} root_node_uuid uuid of the node in scene
 * @param {string} path use db:// protocol . e.g. 'db://assets/prfabs/'
 */
_Scene.createPrefab(root_node_uuid, path);

发现了一个内部被隐藏的API,利用这个可以生成。内部API的
Editor.require,Editor.serialize我都是解析代码才知道怎么用的。如果官方能公开就好了。

const PrefabUtils = Editor.require("scene://utils/prefab");
// 下面的go变量是一个cc.Node的实体
let prefab = PrefabUtils.createPrefabFrom(go);
      let prefabPath = prefabUrl + prefab.data.name + ".prefab";
      let serializedPrefab = Editor.serialize(prefab);
      Editor.Ipc.sendToMain(
        "scene:create-prefab",
        prefabPath,
        serializedPrefab,
        (e, t) => {
          if (e) return cc.error(e);
        }
      );
4赞

这个方案可行,效果也是目前最好的