一、Cocos扩展介绍

Cocos扩展可以让Cocos Creator用户定制和扩展编辑器的功能。这些扩展以包(package)的形式进行加载。

Cocos Creator 的扩展包沿用了 Node.js 社区的包设计方式,通过 package.json 描述文件来定义扩展包的内容和注册信息。

需要注意的是,Cocos Creator 2.x 系列和 Cocos Creator 3.x 系列的扩展不兼容,位置也不同,所以开发教程也不同。本文讲的是 Cocos Creator 2.x 系列扩展开发教程,Cocos Creator 3.x 系列放在下一篇。

官方开发教程在:扩展编辑器 · Cocos Creator

Cocos扩展的商店页面是 https://store.cocos.com/app ,可以在Cocos Creator IDE中直接打开。

注:图二中的SmartAd试玩打包工具就是本文要讲的案例。

二、教程案例介绍

1.案例背景

本案例介绍的扩展名叫SmartAd试玩打包工具,是一个Cocos打包试玩广告的扩展。

试玩广告是一种新兴广告类型,在近几年开始兴起。与传统广告格式(如图片和视频)不同,试玩广告对用户具有高度互动性,在广告展示时,可以与用户进行交互,使广告变得更丰富有趣。

这些广告能在 30 秒内吸引观众的注意力、展示游戏玩法并转化用户。即使在竞争激烈的市场中,它们也能提供低用户获取成本(CPI)、高转化率 (CVR) 和点击率 (CTR)。

试玩广告本质上是一个HTML网页,通过JS等技术响应用户操作,与用户产生互动。由于带宽和加载速度的原因,试玩广告一般对文件大小都有严格要求,大多数投放渠道的要求是不超过5M,且要求单文件,即所有资源都要在一个HTML中加载展示。

Cocos因为引擎的特性,非常适合用来制作试玩广告,但Cocos导出的工程是一个多文件目录,需要用专门的工具进行单文件打包,并接入各渠道的SDK,这是一个耗时耗力的过程。SmartAd平台开发了一个工具,可以一键完成Cocos工程导出试玩广告,为了更方便用户使用,因此需要开发一个Cocos Creator扩展,方便用户的使用。

关于试玩广告,如果你想了解更多可以阅读这篇文章:应用、游戏和品牌的新营销方式-试玩广告-帮助中心-SmartAd试玩广告制作平台

2.扩展流程

本扩展的流程是:

3.涉及到的知识点

  • 扩展基本结构
  • 多语言
  • 扩展菜单添加
  • 扩展面板UI编写
  • UIKit的使用
  • 扩展数据交互
  • 文件上传
  • 扩展打包上架

三、创建基本结构

在菜单上选择扩展->创建新扩展插件 -> 全局扩展(安装在用户目录下)即可创建一个扩展,这里名字用SartAdDemo

上面的操作,会在用户目录生成一个目录,结构如下:

这几个文件作用如下:

1.package.json

package.json是扩展定义,文件内容如下:

{"name": "SmartAdDemo","version": "0.0.1","description": "The package template for getting started.","author": "Cocos Creator","main": "main.js","main-menu": {"i18n:MAIN_MENU.package.title/SmartAdDemo/open": {"message": "SmartAdDemo:open"},"i18n:MAIN_MENU.package.title/SmartAdDemo/hello": {"message": "SmartAdDemo:say-hello"}},"panel": {"main": "panel/index.js","type": "dockable","title": "SmartAdDemo","width": 400,"height": 300}
}

值分别表示:

  • "name": 扩展名(只能全小写)
  • "version": 扩展版本号
  • "description": 扩展描述
  • "author": 作者
  • "main": 入口文件
  • "main-menu": 菜单
  • "panel": 面板
    • "main": 面板入口
    • "type": 面板类型
    • "title": 面板标题
    • "width": 面板宽度
    • "height": 面板高度

2.main.js

扩展的入口文件,在package.json中的main中引入

'use strict';module.exports = {load () {// execute when package loaded},unload () {// execute when package unloaded},// register your ipc messages heremessages: {'open' () {// open entry panel registered in package.jsonEditor.Panel.open('SmartAdDemo');},'say-hello' () {Editor.log('Hello World!');// send ipc message to panelEditor.Ipc.sendToPanel('SmartAdDemo', 'SmartAdDemo:hello');},'clicked' () {Editor.log('Button clicked!');}},
};

值分别表示:

  • load:扩展加载调用
  • unload:扩展关闭调用
  • messages:消息(IPC通信)
    • open:对应open菜单
    • say-hello:对应say-hello菜单
    • clicked:对应页面上按钮的点击事件

3.panel/index.js

面板入口文件,在package.json中引入:

// panel/index.js, this filename needs to match the one registered in package.json
Editor.Panel.extend({// css style for panelstyle: `:host { margin: 5px; }h2 { color: #f90; }`,// html template for paneltemplate: `<h2>SmartAdDemo</h2><hr /><div>State: <span id="label">--</span></div><hr /><ui-button id="btn">Send To Main</ui-button>`,// element and variable binding$: {btn: '#btn',label: '#label',},// method executed when template and styles are successfully loaded and initializedready () {this.$btn.addEventListener('confirm', () => {Editor.Ipc.sendToMain('SmartAdDemo:clicked');});},// register your ipc messages heremessages: {'SmartAdDemo:hello' (event) {this.$label.innerText = 'Hello!';}}
});

值分别表示:

  • style:面板HTML样式
  • templete:面板HTML模板
  • $:面板HTML元素与JS变量绑定
  • ready:当面板加载完后调用,相当于window.onready事件
  • messages:ipc通信事件注册

四、多语言

1、方案

Cocos Creator编辑器扩展系统中内置了多语言方案,具本做法是在扩展包的目录下新建一个名叫 i18n 的文件夹,并为每种语言添加一个相应的 JavaScript 文件,作为键值映射数据。数据文件名应该和语言的代号一致,如 en.js 对应英语映射数据。

如:

// en.js
module.exports = {'search': 'Search','edit': 'Edit',
};// zh.js
module.exports = {'search': '搜索','edit': '编辑',
};

2、在脚本中使用

在 JavaScript 脚本中,可以通过 Editor.T 接口获取当前语言对应的翻译后的文本,如:

// NOTE: my package name is "smartaddemo"
Editor.T('smartaddemo.search');

在编辑器面板的模板定义文件里,也可以直接使用这个接口,如:

// NOTE: my package name is "smartaddemo"
Editor.Panel.extend({template: `<div class="btn">${Editor.T('smartaddemo.edit')}</div>`
});

3、在菜单中使用

在扩展包的 package.json 中注册菜单时可以用 i18n:${key} 的形式进行多语言翻译。

我们的扩展只需要一个打开,所以更改如下:

{"name": "SmartAdDemo","version": "0.0.1","description": "The package template for getting started.","author": "Cocos Creator","main": "main.js","main-menu": {"i18n:MAIN_MENU.package.title/SmartAdDemo/i18n:SmartAdDemo.open": {"message": "SmartAdDemo:open"}},"panel": {"main": "panel/index.js","type": "dockable","title": "SmartAdDemo","width": 400,"height": 300}
}

对应的i18n文件如下:

// en.js
module.exports = {'open': 'SmartAd Playable Ads Pack'
};// zh.js
module.exports = {'open': 'SmartAd试玩广告打包'
};

五、扩展菜单添加

Cocos Creator 的主菜单是可以自由扩展的。扩展方法是在 package.json 文件中的 main-menu 字段里,加入自己的菜单路径和菜单设置选项。

我们这里只需要一个,所以配置如下:

{"main-menu": {"i18n:MAIN_MENU.package.title/i18n:smartaddemo.open": {"message": "smartaddemo:open"}},
}

效果如图:

六、扩展面板UI编写

1.原型图

面板原型图如图:

2.结构优化

为了让代码更具可读性,我们把面板分为html和css及js的方式,具体做法是在panel目录下创建index.html、index.css文件,并在index.js中引用。

目录如下:

3.具体实现

index.html:

<h2 class="title">欢迎使用SmartAd一键试玩广告打包工具</h2>
<p>步骤一:添加SmartAd SDK(仅需一行代码,即可导出全渠道试玩广告)</p>
<p>步骤二:构建项目(选择Web Mobile平台)</p><a href=":;" id="help_link">查看教程文档或咨询人工客服</a>
<div id="msg"></div>
<div class="btn_group"><ui-button id="cancel_btn" style="background: #999;margin-right: 50px;" class="button-item">取消</ui-button><ui-button id="pack_btn" class="button-item" style="background: #f90;">打包</ui-button>
</div>

index.css:

body {background: #fff;
}:host {margin: 5px;
}h2 {color: #fff;text-align: center;
}p {font-size: 16px;
}.btn_group {text-align: center;margin-top: 20px;
}.button-item {width: 130px;height: 40px;border-radius: 5px;color: #fff;
}#msg {color: white;padding: 10px;margin-top: 20px;font-size: 20px;line-height: 24px;border-radius: 5px;word-break: break-all;background: #000;
}

index.js:

const fs = require('fs');
// panel/index.js, this filename needs to match the one registered in package.json
Editor.Panel.extend({// css style for panelstyle: fs.readFileSync(Editor.url('packages://SmartAdDemo/panel/index.css')),// html template for paneltemplate: fs.readFileSync(Editor.url('packages://SmartAdDemo/panel/index.html')),// element and variable binding$: {cancel_btn: '#cancel_btn',pack_btn: '#pack_btn',help_link: '#help_link',msg: '#msg'},// method executed when template and styles are successfully loaded and initializedready() {},
});

这里通过fs模块读取文件的方式引入html和css。

4.运行效果

效果如图所示

七、UIKit的使用

1.UIKit介绍

Cocos Creator 为开发者提供了非常丰富的界面元素,称为UIKit,帮助开发者快速地开发面板界面。

目前常见的界面元素包括:

  • ui-button
  • ui-checkbox
  • ui-color
  • ui-input
  • ui-select
  • ui-slider
  • ui-text-area

全部元素见:掌握 UI Kit · Cocos Creator

2.UIKit的使用

我们这里只用 ui-button 做演示,在html中的取消和打包按钮分别如下:

<ui-button id="cancel_btn" class="button-item">取消</ui-button>
<ui-button id="pack_btn" class="button-item">打包</ui-button>

3.UIKit元素的获取

在面板上定义了uikit后,在js中通过$进行绑定:

  $: {cancel_btn: '#cancel_btn',pack_btn: '#pack_btn'}

使用时直接用 this.$cancel_btn即可。

八、扩展数据交互

按照第2步中的流程,接下来的操作就是用户点击“打包”按钮,开始检测构建文件,并压缩上传。

1.事件监听

我们先来绑定按钮的点击事件,通过 addEventListener方法即可给元素添加事件:

  ready() {this.$cancel_btn.addEventListener('confirm', () => {Editor.Panel.close('smartaddemo');});this.$pack_btn.addEventListener('confirm', () => {});this.$help_link.addEventListener('click', () => {});},

如上面的代码,我们分别给“取消”、“打包”和帮助文字添加了点击事件。

2.调用其他模块

为了让代码更好地组织和阅读,我们把主要的逻辑写在扩展的 src/smartAd.js 中,这里实现了扩展的所有流程。

在面板的js中我们可以通过下面的方式对smartAd.js进行引用:

const smartAd = require(Editor.url('packages://SmartAdDemo/src/smartAd'));

在“打包”按钮中进行引用:

const _self = this;
this.$pack_btn.addEventListener('confirm', () => {try {smartAd.main(function msgCallback(msg) {_self.$msg.innerHTML = msg;});} catch (e) {Editor.log(e);}
});

九、文件上传

文件上传使用标准的HTTP POST请求就可以实现。

1.构建form表单

我们这里用的是fs模块的 fs.createReadStream 方法来读取上传的文件,创建一个stream,上传文件的字段字是zip,示例如下:

function upload_zip(zip_file) {let formData = {zip: fs.createReadStream(zip_file),};
}

2.发送请求

这里用的是 request 库,代码如下:

function request_i(params, callback) {let headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36','Content-type': 'application/json','sid': sid}params.headers = headers;request.post(params, callback)
}

十、打包

1.最终的代码

最终的目录结构如下:

2.第三方库

因为我们用到了压缩,所以需要引入第三方压缩库archiver,在package.json中引入:

{"dependencies": {"archiver": "^5.3.0"}
}

然后通过 npm install 进行安装

3.打包

把扩展目录的所有文件(包含node_modules)压缩为ZIP格式,并命名为扩展名称,即可。

十一、上架

1.注册Cocos开发者账号

访问 Cocos 开发者中心 注册账号并登录

2.填写扩展信息

  • 进入 商店 栏目,点击右上方的发布新资源;
  • 然后进入资源类别页面,填写名称和类别 ,勾选已阅读协议;

  • 在 资源介绍 页面填写相关信息;

  • 在 定价 页面设置插件的售价,包括 CNY 和 USD 两种,如果免费请填写 0;

  • 在 上传资源 页面上传插件扩展包资源并填写相关信息;

3.提交审核

填写完以上信息后,在 提交审核 页面点击 提交审核 按钮即可,一般3个工作日会有结果。

更详细的信息请参考:提交插件到商店 · Cocos Creator

十二、结束

好了,以上就是Cocos Creator 2.x 版扩展开发的相关内容,欢迎留言交流。

Cocos 2.x 扩展开发教程相关推荐

  1. php7扩展开发教程,Laravel 7 扩展开发教程

    下面由Laravel入门教程栏目给大家介绍Laravel 7 扩展开发教程,希望对需要的朋友有所帮助! 步骤 1. 创建一个新项目 我更喜欢使用 Laravel 安装程序.laravel new la ...

  2. Adobe CEP 扩展开发教程 「 1 」

    本篇会从配置 CEP 的开发环境开始讲解如何从零开始构建一个 CEP 扩展,还有关于扩展调试的方法. 配置开发环境 常情况下宿主应用是不会运行未经签名扩展的,只有打包并签名才可以运行,这样我们就没法即 ...

  3. 谷歌浏览器Chrome插件扩展开发教程

    下文是我看到的一篇很好的Chrome扩展开发攻略,感觉很有价值,内容详尽,排版精美,遂转载. 原文由小茗同学发表于小茗同学的博客园:[干货]Chrome插件(扩展)开发全攻略 1. 写在前面 我花了将 ...

  4. php7扩展开发教程,Linux下PHP7扩展开发入门教程1:扩展开发流程

    本文将会基于PHP7开发一个最简单的扩展,随便取个名learn_ext,编译生成一个learn_ext.so文件,最终调用可以在php中调用learn_ext扩展中的函数来输出一个hello worl ...

  5. PHP扩展开发教程,通过实例来展示PHP的扩展开发和底层应用原理(C语言非zephir)...

    主要是使用C语言来开发PHP扩展,现在的案例正在一步一步完善中,希望有兴趣的朋友一起来加入和完善,现在已经完成的案例如下: Dicretory Explain hello_word php hello ...

  6. 一、如何创建一个状态栏扩展(火狐插件扩展开发教程)

    因为项目的需要,一些功能需要在火狐上面实现,一点也不了解火狐插件的开发,网上的中文资料也少得可怜, 没办法,只好自己研究一下英文文档,慢慢开发了,在这里备份一下. 学编程,当然是从Hellow,wor ...

  7. php扩展调试,5分钟学会PHP扩展开发与断点调试

    很多PHPer都有尝试写PHP扩展的经历,但网上现有的扩展开发教程大都晦涩难懂,官方文档更是让人看的云里雾里.无形之中垒高了PHP扩展开发的门槛."每个PHPer都应该抽空看一些PHP扩展的 ...

  8. Firefox的扩展开发介绍

    Firefox的扩展开发介绍 陈彦旭 2009年3月5日 1目的 开发基于Firefox的Grabpro,要求和IE上的Grabpro具有相同功能和UI. 2简介 以前在IE中开发的Grabpro是使 ...

  9. 红孩儿网狐Cocos经典棋牌开发教程-卞安-专题视频课程

    红孩儿网狐Cocos经典棋牌开发教程-4750人已学习 课程介绍         由知名Cocos技术讲师红孩儿讲解的基于网狐源码进行棋牌开发的系列教程. 课程收益     1.快速理解掌握网狐棋牌的 ...

最新文章

  1. 2008 R2 辅域安装和卸载(加域、退域及组策略的测试)
  2. HTTP中response响应数据获取
  3. MySQL 笔记6 -- 函数与事务
  4. QT的QMultiMap类的使用
  5. 可怕!公司部署了一个东西,悄悄盯着你……
  6. 鸿蒙os来了,华为操作系统“鸿蒙OS”来了!
  7. Oralce 日期操作
  8. char,nchar,varchar与nvarchar区别
  9. 〖3D激光点云〗深度学习点云知识!
  10. 电子设计教程33:RC桥式正弦波振荡电路
  11. STM32L452CCU6 STM32L432KCU6 GD32F407VKT6 嵌入式技术数据手册 32位ARM
  12. C语言也能干大事第六节(如鹏基础)
  13. Linux——shell脚本的基础篇(变量定义、变量种类、变量操作)
  14. 67 Ways to Increase Conversion with Cognitive Biases
  15. navicat 表合并查询_navicat怎么合并表格
  16. 利用RNAi研究马铃薯基因功能——StRIK与外表皮应激反应
  17. 记录中通自研面单功能
  18. 虚拟服务器的好处与坏处,虚拟主机有什么坏处
  19. html 中按钮控件变为透明,css如何实现按钮透明
  20. 虚拟机桥接模式下连接网络失败解决

热门文章

  1. 我的世界服务器改无限跳跃,我的世界作弊码大全 再也不怕精英怪物了
  2. 商务搜索引擎_外贸研修 | 世界各国常用搜索引擎,开发客户必备!
  3. 父元素设置min-height,子元素height 100%失效问题
  4. 【汇编语言学习】汇编语言基础(一)
  5. 给程序员推荐提高工作效率的软件
  6. 计算机主机降温,宁美国度教你电脑降温妙招
  7. uniapp 调用阿里云OCR行驶证识别
  8. C语言 计算签到所得积分
  9. SpringBoot--->>>web-->>定制化原理
  10. 新手必学的20个人像摄影构图法