微人事项目实战的数据库脚本_EMP微前端实战之cocos2d线上项目

b900a7734331d12f4db517d9ff28658e.png

团队原文:

efoxTeam/emp​github.com
cc7d5343c6e8da37bdb05ac9c2ca0314.png


一.背景

目前cocos2d游戏最主要的开发方式是通过官方提供的GUI图形界面工具——creator,通过 creator 开发者无需关注构建本身,只需通过界面操作即可对游戏代码进行构建打包。但是这样也存在着以下几个问题:

  • 构建闭源,导致开发者对项目构建无法定制化,假如编译出来的代码存在兼容性问题,那只能进入 creator 安装目录寻找对应的某个配置文件进行修改,这种侵入性的修改很有可能会引发不稳定性。
  • 无法使用其他构建工具进行打包,意味着项目无法使用新的技术方案,只能局限于 creator 设定的框架之中
  • 游戏组件在不同项目之间难以复用,组件通常包含了 prefabsprite 等资源,如何发布托管并在其他项目复用组件,简单地通过 creator 是无法做到的。通过 EMP微前端的方案 能从根本上解决这些问题

通过这些问题让我们有了一种想法,有没有可能通过其他构建工具打包的代码,也能关联到 creator 的项目中,这样也能在creator cocos2d项目中引入EMP,从而解决组件复用的问题

二. creator项目接入webpack模型

首先看看单一 creator 的开发过程,它会在本地服务开启 7456 的端口服务,整个本地开发流程如下图:

5119bf329f61611def5f54f12e1c1510.png

接入 webpackemp 后的开发过程,首先 webpack 会通过 axios 抓去 creator服务生成出来的 index.html文件作为 template,并开启一个新的服务,并通过 devServer 将资源请求转发回 creator的端口服务,确保资源访问正常,开发流程图如下:

f8d36858aa90e957e52882116fc47a76.png

三. 接入流程

step1

全局安装 @efox/emp-cli,通过 emp init 初始化游戏种子工程,选择 cocos2d 模版

yarn add --global @efox/emp-cli && emp init

step2

在根项目通过命令 yarn 安装依赖

step3

安装 creator cocos 开发工具 ,打开 cocosDashboard, 导入刚刚的游戏模版项目,然后打开项目,下面是导入成功后的开发工具截图;

403514ff6ccec00533eceb2a95681240.png

复制开发工具上方提示的本地调试链接到浏览器上,呈现出来的界面如下,可以看到右方console出现报错的情况,这是因为目前打开的只是 creator 开启的本地服务,而项目引入了 webpack 构建的代码,所以暂时会出现报错的情况;

659d10b02dea92c71e5abe6ec580a913.png

step4

进入项目根目录,运行 yarn dev

浏览器会自动打开新端口服务,这个本地服务就是 webpack 代理 creator cocos 后的服务,通过下图看到console已经没有报错了,并且界面上的 Hello World拥有了渐变背景色,这个渐变背景色实际上就是一个 Game Component,是通过 webpack 构建并注入到游戏项目中引入的;

84cfdb490c94fb285a0540f9e65bfc3a.png

ps: 必须先通过creator cocos开启项目,再运行 yarn dev,因为 webpack 编译时需要通过 axios 抓取 creator cocos 服务模版;

四. 项目代码分析

emp-config.js

// cocos2d emp配置
const withCocos2d = require('@efox/emp-cocos2d')
const ip = require('ip')module.exports = withCocos2d(({config, env, empEnv}) => {// webpack本地服务端口const port = 9000const projectName = 'empCocos2dDemo'const host = ip.address()const publicPath = `http://${host}:${port}/`config.plugin('mf').tap(args => {args[0] = {...args[0],...{name: projectName,library: {type: 'var', name: projectName},filename: 'emp.js',// remotes: {//   '@emp-game/base': 'empGameBase',// },exposes: {// 将当前项目的component expose出去给其他项目使用'./components': 'src/components',},},}return args})config.output.publicPath(publicPath)config.devServer.host(host)config.devServer.port(port)},{// creator开启的服务端口creatorPort: 7456,// 引用基站资源链接empJs: [],},
)

src/index.ts

webpack 的代码如何注入到 creator cocos 代码中,靠的是 cc 这个全局变量,cc 变量是cocos2d引擎暴露在全局的,包含了全部的引擎方法;creator cocos 接入 emp 的关键点就是在 cc全局变量上创建一个 EMP 属性,这样后续无论远程组件模块,抑或是本地构建的module, 都可以附值在 cc.EMP 上,从而在游戏代码中引入;

cc这个全局变量是cocos2d引擎暴露在全局的,这里也分为本地环境和生产环境的情况,这是因为本地环境cocos2d引擎脚本是同步加载的,而生产环境是异步的,这就是为什么下面代码判断了 window.boot 是否存在的情况,附值 cc.EMP 的操作是需要 cc 存在才能进行;

import Components from 'src/components'export type EMPData = {Components: typeof Components
}const EMP: EMPData = {Components,
}// 关键部分
// 生产环境 cocos2d脚本异步加载后 再执行window.boot
// 通过重写 window.boot 在函数体内进行cc.EMP附值,再执行原函数,确保游戏代码运行时 cc.EMP正常有值
if (window.boot) {const fn = window.bootwindow.boot = async function () {cc.EMP = EMPfn()}
} else {// 本地环境 直接附值cc.EMP = EMP
}

assets/Script/HelloWorld.ts

看回游戏代码,了解游戏代码是如何引入外部组件的

const {ccclass, property} = cc._decorator@ccclass
export default class Helloworld extends cc.Component {@property(cc.Label)label!: cc.LabelonLoad(): void {// 通过cc.EMP获取Component模块// 再通过Component模块拓展出渐变背景色组件const {colorGrad} = cc.EMP.Components// 获取labelNode 节点const labelNode = cc.find('labelNode', this.node)const label = cc.find('label', labelNode)// 通过addComponent添加渐变背景色,并设置脚本属性 _colorslabelNode.addComponent(colorGrad)._colors = [cc.Color.WHITE.fromHEX('#ffffff'),cc.Color.WHITE.fromHEX('#5A51FF'),cc.Color.WHITE.fromHEX('#8668FF'),cc.Color.WHITE.fromHEX('#5A51FF'),]setTimeout(() => {// 重设labelNode节点宽高labelNode.setContentSize(label.width, label.height)})}
}

五. 已有项目如何接入

接入步骤如下:

  1. 在根项目安装 emp 相关依赖;
yarn add -D @efox/cli
yarn add -D @efox/emp-tsconfig
yarn add -D @efox/emp-cocos2d
  1. package.json 添加如下片段:
{...,"scripts": {...,+ "dev": "emp dev",+ "build": "emp build --ts --env prod && cp -r ./dist/. ./build/web-mobile"}
}
  1. 根目录创建 emp-config.js,并复制以下内容
const withCocos2d = require('@efox/emp-cocos2d')
const ip = require('ip')module.exports = withCocos2d(({config, env, empEnv}) => {const port = 9000const projectName = 'empCocos2dDemo'const host = ip.address()const publicPath = `http://${host}:${port}/`config.plugin('mf').tap(args => {args[0] = {...args[0],...{name: projectName,library: {type: 'var', name: projectName},filename: 'emp.js',// remotes: {// },exposes: {},},}return args})config.output.publicPath(publicPath)config.devServer.host(host)config.devServer.port(port)},{// creator开启的服务端口creatorPort: 7456,// 引用基站资源链接empJs: [],},
)
  1. tsconfig.json 替换如下内容:
{"extends": "@efox/emp-tsconfig","compilerOptions": {"experimentalDecorators": true,"baseUrl": "./"},"include": ["src", "creator.d.ts", "index.d.ts", "assets"]
}
  1. 创建 src 目录,并新建 index.ts
export type EMPData = {}const EMP: EMPData = {}if (window.boot) {const fn = window.bootwindow.boot = async function () {cc.EMP = EMPfn()}
} else {cc.EMP = EMP
}
  1. 创建 index.d.ts,定义 cc.EMP 类型声明
import {EMPData} from './src'declare global {namespace cc {export let EMP: EMPData}interface Window {boot: () => void}
}

六. 总结

目前 creator cocos 游戏开发只能依赖官方开发工具,接入这套模型,能使得项目定制化更加便捷,且具有以下优点:

  1. 几乎零成本接入

首先看看接入 emp 后的 creator cocos项目目录结构

a60bc5638a8710f0e65fb9bb84bbe090.png

由上图可以看出,与 普通的creator cocos2项目 相比,只多了以下2个文件1个目录

  • src/*
  • emp-config.js
  • index.d.ts

无需改变原游戏代码任何的部分,做到了几乎0成本接入

  1. 将开发方式回归到我们熟悉的步伐上,且更灵活,原本的开发方式是GUI工具制作 一个一个 prefab,再写一个一个脚本绑定进去,虽然操作简单,但开发体验很不好,接入模型后,GUI工具依然负责制作 prefab,但脚本就可以抽离出来由webpack构建,这能给编写的脚本带来更多的新特性,丰富开发方式;
  2. 组件开发灵活,多项目共享,当前开发游戏组件只能在当前项目复用,如果其他游戏项目也想用呢?这时可能会想到发布到官方托管的仓库或者npm仓库,但是有个问题,如果这个组件依赖了图片,那发布到npm仓库可能是一个难题;emp基站的模型能很好地解决这些问题,因为本身游戏项目就是一个基站,其他游戏项目可以轻松复用其他游戏 expose 出来的组件

不同游戏项目之间组件的互相调用,可以参考 EMP中的cocos2d

基于Webpack 5 Module Federation实现的 EMP微前端方案,creator cocos这种闭源的开发过程都能接入 EMP,证明这套方案并不局限技术栈;如果是刚开始接触微前端的话,可以尝试去了解一下,可以带给你很好的使用体验喔

具体的EMP微前端方案教程目录如下:

  • 基础知识解析
    什么是微前端
    对比多种微前端方案
    webpack5 module Federation原理学习
    EMP的设计架构
  • 快速入门
    react项目如何使用和接入EMP
    vue项目如何使用和接入EMP
    辅助插件的使用教程
  • 进阶教程
    Vue和React项目如何互相远程调用
    cocos2d 项目如何使用和接入EMP
    教你基站搭建技巧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线粒体和叶绿体的基因组特点_如何组装植物叶绿体基因组

可能出现的问题:*个人电脑上遇到不能collect memery的情况,是电脑内存较少,建议分成用2G左右的数据进行组装。* Seed.fasta #用于起始组装的种子序列,NOVOPlasty安装软件目录下有这个文件,就叫这个名字,作者…

f3arra1n3.4.1版本_Sysmon v11.1新版本功能测试报告

一、概述根据微软文档的介绍,Sysmon v11新增了监控文件删除的功能,并支持对删除的文件进行存储备份,极大提高了主机威胁检测的能力。同时增加禁用反向DNS查询的功能,可以有效降低噪音数据。Sysmon从v10.0到目前的v11.1共经历了5个…

maya导出fbx没动画_Maya学习方法总结

关注我,一起来了解建模吧!今天小编就来总结一下Maya学习过程中遇到的困难和解决方法,我相信有一些应该也是普遍性问题,注意:小编说的版本是Maya2018。(1)一次性删除所有帧的方法import的文件如果…

dev 中 gridcontrol1 滚动条重绘_浏览器的重绘和回流(Repaint amp; Reflow)

参考文献:https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hlzh-cn​developers.google.com你真的了解回流和重绘吗 Issue #4 chenjigeng/blog​github.com前言:重绘:由于…

矿井通风计算c语言_矿井通风机主要参数的含义

矿井通风机的作用就是把地面新鲜空气送到井下,供工人呼吸,同时把有害气体从井下排出,使有害气体的浓度降到对人体无害的程度,在现代化煤矿中称通风机为“矿井的肺脏”,可见其重要性。风机的参数是风机选型的唯一依据&a…

行健设计_行健要闻|“第四届‘天行健创新创业设计大赛”培训班成功举办

10月9日下午,由院团委主办、商学部承办第四届“天行健”创新创业设计大赛动员大会暨首场培训讲座在教学楼4-103室成功启动。院团委副书记唐典巧参加动员会,并颁发了第九届“挑战杯”广西大学生课外学术科技作品竞赛荣誉证书,动员会由商学部辅…

ip地址转换pta题目_PTA「实验2-3-5 输出华氏-摄氏温度转换表」

PTA是浙江大学设计类实验辅助教学平台。题目描述输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper]、且每次增加2华氏度的华氏-摄氏温度转换表。温度转换的计算公式:C5(F−32)/9&#…

语言爬虫字段为空_我为什么建议前端将Python 作为第二语言?

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者: 前端劝退师PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://note.youdao.com/noteshare?id3054c…

5 获取当前访问的控制名称_LabVIEW编程技巧:网络通信中如何获取计算机名称、IP地址等信息...

问题引出在网络通讯编程中,经常需要获取当前主机的名称、IP地址等信息,在LabVIEW中如何获取这些信息呢?下面以本机为例进行说明,先看一下本机的信息。在Windows系统中打开控制台程序,输入“ipconfig /all”指令&#x…

postman生成python代码_别再用手敲了,这个工具可以自动生成python爬虫代码

我们在写爬虫代码时,常常需要各种分析调试,而且每次直接用代码调试都很麻烦所以今天给大家分享一个工具,不仅能方便模拟发送各种http请求,还能轻松调试,最重要的是,可以将调试最终结果自动转换成爬虫代码&a…

电工结业试卷_电工技术基础结业考试试卷

电工技术基础结业考试试卷适用年级2016级秋6班电子、计算机专业班级 姓名 学号一、 判断题(每题2分,共30分)1、 电位越高则电压越大。2、万用表的电压、电路及电阻档的刻度都是均匀的。3、 在任何情况下,电压源和电流源之间总是可以等效变换的。 4、 电容…

表格里面怎么打多个√_Excel怎样在表格里打√?

我们做表的时候有时会遇到输入对或错的情况。Excel表格里面输入√和,普通的方法是直接插入特殊符号来进行对勾的输入。这样输入起来1个2个还可以接受,但是如果频繁输入,那我们得想想简单方法。比如我们直接在excel单元格里面输入1显示√&…

@value 默认值为null_JAVA8之妙用Optional解决判断Null为空的问题

引言在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示在这种情况下,有如下代码user.getAddress().getProvince();这种写法,…

mysql百万数据根据索引查询_mysql创建多列索引查询百万表数据的性能优化经验分享...

最近发现最代码网站中的收到的评论,提到我的,心情被赞的查询异常缓慢,通过nginx日志发现响应时间快的在5s,慢的有13s,终于忍无可忍花时间来解决了。执行explain之后的截图如下:可以看到possible_keys中有很…

php用到的mysql语句_PHP中常用到的一些MySQL语句_php

在php开发中,经常会使用到mysql语句,下面就为您列举了一些经常使用的MySQL语句,希望对您平时的学习和开发工作能起到些许的作用。MySQL语句显示数据库或表:show databases;//然后可以use database_name;show tables;MySQL语句更改表名:alter …

mysql执行计划性能_MySQL SQL性能分析Explain执行计划

一. 执行计划返回信息详解①. 执行计划所含字段输出列含义id查询标识select_type查询类型table查询涉及的表partitions匹配到的分区信息type连接类型possible_keys可能选择的索引key实际使用的索引key_len实际使用的索引的长度ref和索引进行比较的列rows需要被检索的大致行数fi…

mysql定时作业_mysql 让一个存储过程定时作业的代码(转)

1、在mysql 中建立一个数据库 test1语句:create database test12、创建表examinfocreate table examinfo(id int auto_increment not null,endtime datetime,primary key(id));3 插入数据:insert into examinfo values(‘1‘,‘2011-4-23 23:26:50‘);4 …

table虚线边框_web前端工程师7天0基础到精通(TABLE+CSS制作《互联世纪网》)

项目七 项目实践:TABLECSS制作《互联世纪网》实践目标1、 熟悉CSS属性2、 熟练运用CSS属性控制网页样式3、 熟悉网页制作流程项目简介:通过上一章节的学习,我们了解了CSS样式能更加方便、有效地控制网页结构和布局网页元素,大大提…

mixamo骨骼_mixamo动作库的模型和动作绑定控制器的方法-上集

1.首先从网站下载带调好动作的文件fbx,我们将fbx场景文件转换成c4d场景文件。没转换之前转换之后选择场次,在文件菜单里找到当前场次到新文档!2.我们将模型重置为Tpose方便后续操作,没重置之前模型为k好的动作模式不能使用选中权重…

mysql 101_MySQL 调优/优化的 101 个建议!

原文:http://www.monitis.com/blog/101-tips-to-mysql-tuning-and-optimization/MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈。这里提供 101 条优化 MySQL 的建议。有些技巧适合特定的安装环境,但是思路是相…