调用引擎 API 和项目脚本

在插件中可以声明一个特殊的脚本文件(场景脚本),该脚本和项目中的脚本(assets\ 目录下的脚本)具有相同的环境,也就是说在这个脚本里可以调用引擎 API 和其他项目脚本,实现:

  • 遍历场景中的节点,获取或改动数据

  • 调用项目中的其他脚本完成工作

注册场景脚本

首先在 pacakge.jsoncontributions 属性中添加 scene 字段,该字段的值是一个脚本文件的路径,相对于扩展包目录:

{
    "name": "engine",
    "contributions": {
        "scene": {
            "script": "./scene.js"
        }
    }
}

编写场景脚本

定义 scene.js 的方法如下:

// 模块加载的时候触发的函数
exports.load = function() {};
// 模块卸载的时候触发的函数
exports.unload = function() {};

// 模块内定义的方法
exports.methods = {
    log() {
        const scene = cc.director.getScene();
        if (scene) {
            scene.walk(target => console.log(target.name));
        } else {
            console.warn('Scene not found');
        }
    }
};

注意:由于升级了脚本系统,原本使用和项目脚本相同的模块引用机制的 cc.require 方法被弃用。

发送消息到 scene.js

在扩展包程序的主进程和渲染进程中,都可以使用下方的接口向 scene.js 发送消息(假设扩展包名是 foobar):

interface ExecuteSceneScriptMethodOptions {
    // Name of extension
    name: string;
    method: string;
    args: any[];
}

const options: ExecuteSceneScriptMethodOptions = {
    name: 'foobar',
    method: 'log',
    args: []
};

await Editor.Message.request('scene', 'execute-scene-script', options);

这样就可以在扩展包中获取到场景所有节点的名字,当然还可以用来对场景节点进行更多的查询和操作。

注意:由于通讯基于 Electron 的底层 IPC 实现,所以切记传输的数据不可以包含原生对象,否则可能导致进程崩溃或者内存暴涨。建议只传输纯 JSON 对象。

results matching ""

    No results matching ""