跳至主要內容

3.x 插件开发指南

muzzik大约 9 分钟文章CocosCocosCreator 插件

# 前言

此贴作为成都 Star Meetings 活动的扩展贴,方便大家更好的阅读理解

1.为什么要开发插件?

  • 任何重复机械式的劳动都是无意义的,一切机械劳动皆可自动化,而插件能帮助我们实现自动化

2.插件能给我们带来什么?

  • 时间,解决了自动化的问题,最大的好处当然是节省了我们额外的手动操作时间,正所谓寸金难买寸光阴,节约时间便是插件最大的价值
  • 收益,插件在给我们自己带来好处的同时,也可以发布到 cocos 商店,给他人带来便利的过程中,也可以给自己带来额外的收益
  • 生态,unity 的生态就不用说了吧,各种插件涵盖了方方面面,这都是插件开发者的功劳,我们的每个插件,都可以给 cocos 的生态添砖加瓦
  • 技术,插件开发包括但不限于 HTML,CSS,NodeJs,Vue,可以帮我们拓展技术范围,增加个人竞争力

# 目录

  • 入门
    • 创建插件
    • package.json 简述
    • 插件多语言
    • 怎么通过消息启动插件面板
    • 插件面板的内容编写
    • 消息系统
    • 场景脚本
    • 配置系统
    • 插件编译
    • 发布插件
  • 进阶
    • 理解主进程和渲染进程
    • 使用 element-plus
    • html 和 css 调试技巧
    • 扩展 inspector
    • 插件公共代码库
    • 插件编译器
  • 深入
    • 使用 creator 制作插件 UI
    • 调试主进程代码
    • 代码加密的方式

# 入门

# 创建插件

我们可以从顶部菜单栏中打开 扩展/创建扩展

# 创建插件 - 插件放在哪儿?

我们可以从顶部菜单栏中打开 扩展/扩展管理器 从找到我们的插件,点击 Open Folder

# 创建插件 - 插件初始化

由于我们的插件可能一开始会依赖部分 npm 模块,所以需要初始化

  • cd 插件根目录
  • npm i

# package.json 简述

package.json 是一个在插件根目录内的文件,里面包含了很多信息,相当于插件的身份证,这里我们只说了最重要的三个配置

  • main 关系到插件能否正常启动
  • panels 关系到面板能否正常展示
  • contributions 插件大部分的配置都在这里面

    参考链接
  • 入门示例-菜单 · Cocos Creator

# 插件多语言

在开发中我们经常使用多语言,插件多语言怎么使用的呢?其实是靠一个放在插件根目录的 i18n 文件夹来实现,文件里面存放的文件名是语言代号,内容则是一个导出的对象

>


参考链接

# 插件多语言 - 使用方式

# 怎么通过消息启动插件面板

首先我们要启动插件面板需要先注册一个菜单项,在 package.json 的 contributions.menu 里面,写入一个含有 path、label、message 属性的数据

这些内容代表了什么?

  • 菜单路径
  • 菜单点击触发的消息

# 怎么通过消息启动插件面板 - 怎么监听消息


我们可以在 package.json 文件中的 contributions.messages 中写入我们监听的消息名以及触发的方法数组

我们所有的事件都是在 messages 里面注册,这里的 open-panel 就是我们注册的事件
参考链接

# 怎么通过消息启动插件面板 - 看看回调做了什么


在 open_panel 内我们调用了 Editor.Panel.open,这就是打开面板的方法

  • Editor.Panel.open:打开面板,参数为扩展名 | 扩展名.面板名

    到这里点击菜单后我们的插件面板就打开了

# 插件面板的内容编写

首先是面板的一些基础属性,我们在 package.json 内的 contributions.panels 中定义

  • title:面板标题
  • type:dockable(可停靠) | simple(不可停靠)
  • main:面板入口脚本文件夹,文件名默认为 index.js
  • size:面板大小信息

# 插件面板的内容编写 - 面板展示内容控制

也就是在 index.js 文件中我们导出的对象,template 则为 html 内容,style 则为 css 内容

参考链接

# 插件编译

使用 ts 写插件自然需要将其编译为 js 才能使用
我们可以在命令行输入以下命令进行脚本编译

  • tsc -b [tsconfig 所在目录]:单次编译
  • tsc -w [tsconfig 所在目录]:监听编译(在 ts 文件保存后且有改动就会自动编译)
    我们也可以配置脚本命令,在 vscode 内可以通过 ctrl + shift + p 来搜索并执行

# 发布插件

# 进阶

# 理解主进程和渲染进程

有可能大家接触插件开发的时候听说过主进程和渲染进程,但是并不了解,那么它们是什么呢?

  • 主进程:package.json 中 main 属性的脚本运行进程(插件入口脚本
  • 渲染进程:package.json 中 contributions.panels 中 main 属性的脚本运行进程(插件面板入口脚本

# 理解主进程和渲染进程 - 不同进程如何交互

  • 通过消息系统:最简单的方式
  • 通过 websocket:一般没人这样做

# 理解主进程和渲染进程 - 进程间使用误区

  • 进程间数据不是共享的,而是单独的

注:这里经常犯的错就是认为自己使用的是同一份数据,其实是两份单独的数据,不同进程间的数据互不干扰

  • 不要把昂贵的计算逻辑放在主进程

注:放在主进程会造成 creator 编辑器界面卡顿,最好放在插件渲染进程或者单独开个子进程

# 使用 element-plus

什么是 element-plus?element-plus 是一个 web 前端常用的 ui 组件库,creator 编辑器虽然也提供了一些插件 ui 组件,但是可能并不满足我们的需求,这时候就可以用 element-plus

参考链接

# html 和 css 调试技巧

插件开发时需要经常修改 html 与 css,又不想每次都要重新加载插件怎么办?
我们可以打开插件面板后点击插件面板,再按下 ctrl + shift + i

# 扩展 inspector

inspector 是什么?简答的说就是属性检查器面板内组件展示的内容
怎么定义 inspector? 只需要在 package.json 中的 contributions 中声明即可

参考链接

# 扩展 inspector - 与组件数据的交互方式

inspector 自定义了我们的组件属性面板展示,那么怎么与组件数据交互呢?有两种方式

  • 场景脚本

注:场景脚本可以通过 getScene 拿到场景根节点并以此找到我们的组件进行数据访问修改

  • 消息系统

注:编辑器使用的方式,推荐使用此种方式

为什么推荐使用消息来修改组件数据呢?因为编辑器会依赖这些消息

# 插件公共代码库

在插件开发过程中,我们可能会遇到几份插件都使用同一份代码的情况,这时候我们想要只保留一份公共代码,该怎么操作呢?
答案是 在插件根目录 tsconfig.include 中添加我们的公共代码库路径

但是这样会使用有个问题,插件编译后路径结构与之前不一致了
前:

  • @libs 目录

  • 插件目录

  • dist 目录

    • src 目录
    • src 目录
      后:
    • @libs 目录
  • 插件目录

  • dist 目录

    • @libs 目录
  • 插件目录

    • src
    • src 目录
      怎么解决呢?这里我写了小工具,插件编译器

# 插件编译器

npm 主页:https://www.npmjs.com/package/@muzzik/cc-plugin-cliopen in new window
功能简介:

  • 自动修改 package,json 中因为引用公共代码库导致的路径不一致问题
  • 自动拷贝依赖的 npm 包到输出目录
  • 输出 zip
    注意不要把输出目录设置为开发目录,否则会删除你的开发代码,代码开源,欢迎贡献代码

# 深入

# 使用 creator 制作插件 UI


看起来很复杂,实现起来很简单,大家别忘了,插件面板也是一个 web 界面,而 web 界面是可以嵌入的,而 creator 也可以输出 web 包,那么事情就很简单了

我们可以通过 iframe 标签嵌入指定网址链接,就可以实现插件面板展示 creator 界面

  • 调试时:嵌入预览网址
  • 发布时:本地开个 http-server,指向编译后的 web 包路径即可

# 调试主进程代码

开发中有可能遇到主进程报错,但是却无法调试的情况,那么我们怎么调试主进程呢?

  • 设置 cocos dashboard 启动选项,path 后为项目根目录
  • 打开 chrome://inspect/#devices 配置
  • 点击 Discover network targets 右侧的 configure 添加 localhost:5858
  • 打开对应的项目,target 下会出现一个新的项,点击蓝色的 inspect,这时候我们就进入了主进程开发者工具,可以使用 ctrl + p 搜索自己插件的 main.js 进行调试

# 代码加密的方式

  • 逻辑放在服务器

注:主要代码放在服务器,插件面板只负责展示,就算代码被偷也无所谓

  • 使用其他语言

注:使用 C、C++编译为 wasm,基本杜绝破解核心代码

  • 混淆

注:只防君子不防小人…

📣 觉得很赞?分享给你的朋友吧!