[3.6.0] 原生插件 sebind 如何编写对应的 TS 接口

https://docs.cocos.com/creator/manual/zh/advanced-topics/jsb-sebind.html

  • 具体的问题或改进建议:原生插件示例文档和 sebind 使用教程文档都只示例了在 console 里调用 native 的函数,而没有示例如何在 TS 脚本里调用 native 。

我正在给一个 Native 动态库编写 Cocos Creator 的 TS 封装层接口,通过 3.6 的“原生插件”功能来实现,目前已经在 console 里跑通了 native 的函数调用。

但是目前不知道如何正确的编写 Native 对应的 TS 接口,先尝试了编写一个 .d.ts 文件,export declare class XXX ,然后在游戏场景的 TS 脚本里去使用这个类,但发现一旦写了 let xxx = new XXX() 后,原生插件导出就会报错说 “error: [build-script]Error: ‘XXX’ is not exported by file://…d.ts, imported by file://…aaa.ts”,而去掉这行 new 就能成功导出

而如果不编写 .d.ts 而是直接编写一个空实现的 .ts 即 export class XXX 里面的函数都提供一个空实现,则能正常运行,但是通过游戏脚本里的调用实际上会走到这个空实现里,然而此时在 console 执行一模一样的代码却能走到 Native 里(能触发 Xcode 断点)而不是走到空实现里

希望 sebind 或原生插件文档能示例一下如何在 TS 里调用 native 函数(以及如何在 native 调用 TS 的函数),提供一个最佳实践。另外也需要示例一下如何打包、分发包含 TS 接口文件的原生插件(用户要如何导入这个原生插件并调用插件提供的 TS 接口)

ts 脚本报错的问题可以通过提供 .d.ts 文件解决.

比如

// Demo.d.ts
declare class Demo {
    constructor(name: string);
    hello(msg: string): string;
}

组件代码

import { _decorator, Component, Node, Label, Color } from 'cc';
const { ccclass, property } = _decorator;

/* 导入 d.ts 的定义 */
///<reference path="./Demo.d.ts" />

@ccclass('DemoComponent')
export class DemoComponent extends Component {

另外也需要示例一下如何打包、分发包

这些过程更多的要参考 编辑器插件相关的文档.

用户要如何导入这个原生插件并调用插件提供的 TS 接口

通过现有的编辑器插件可以实现拷贝 d.ts 文件到目标的工程

感谢!已经跑通了,原来是 VS Code 打开的工程目录层级不对导致的

一开始我是在 XXX.d.ts 里写 declare class XXX ,但发现此时在另外 YYY.ts 文件里报错无法找到 XXX 类。

然后就尝试改成 export declare class XXX 然后在 YYY.ts 里去 import { XXX } from "./XXX.d" 结果出现这个问题

最后发现是我打开的工程目录层级太深了,我的 Cocos Creator 工程在 /aaa/bbb/ccc/ddd/project 目录下然后用 VS Code 打开了 aaa 目录,结果导致报错找不到 .d.ts 文件里定义的类(只是 VS Code 报错而已,Cocos Creator 能正常构建导出 Native 工程)

改为 VS Code 直接打开 project 目录后就不再报错了