如何优雅地升级一个Creator 2.x 项目到 3.6.2 ?
最近,我将之前用 Cocos Creator 2.x 写的一个微信小游戏《球球要回家》移植到了 Cocos Creator 3.6.2 上。
编程语言也从 JavaScript 迁移到了 TypeScript,并成功上线微信小游戏。
不过在升级过程中,也踩到不少坑。
一是如何将 JS 代码高效地翻译成 TS 代码。
另外是,我在使用 Creator 3.6.2 自带的 2.x 项目升级工具存在 BUG,差点让我放弃升级。
不过还好,遇到的问题通过 Cocos 论坛、文档都能解决,在此做个记录,希望对你也有所帮助。

1. 升级项目到 2.4.x 引擎版本
因为 Creator 3.x 已经不在支持 JavaScript 语言,而且 2.4.x 最新版本的 API 接口与 3.x相近。
所以,我的策略是首将代码移植到 2.4.x TypeScript 上。
这一步,主要是解决一些废弃 API 的问题。
在 2.4.10 上,废弃 API 它不会报错,但会以警告的方式提示你。
据了解 95% 的 2.4.x 以下的项目,升 2.4.5+ 是可以平滑升级的。
2. JS转TS脚本
这一步是个体力活,一是对将 JS 脚本翻译为 TS 脚本,二是将新的 TS 脚本重新挂载节点。
我的做法是,比如:看到有个脚本为:GameScene.js,先在它旁边生成一个 GameSceneTS.ts 照着 JS 代码逻辑,按 TS 语法重写一遍代码。

虽然这是个体力活,但是在 VSCode 中写 TS 代码还是很享受的,智能提示非常的方便。
3. 升级项目引擎到 3.6.x
重点来了,这一步需要使用 Creator 3.x 提供的升级工具来升级项目。
使用升级工具,我们可以不必重新去编辑游戏场景和预制体,重新去挂载脚本,能省去不少时间。
新建一个 Creator 3.x 工程,从编辑器主菜单上 文件→导入 Cocos Creator 2.x 项目,看下图:

浏览需要升级的 2.x 工程目录,会弹出下面这样一个面板:

注意:这里有一个坑点!我最初在导入球球要回家 2.4.10 工程后发现,场景中的 Button 按钮点不动。
为了排除是因为脚本引起的问题,我使用 2.4.10 重新建了一个 Hello World 工程,添加上 Button 按钮,再导入 3.6.2 依然有这个问题,
试了多次无解,我再停下来看导入面板上的说明,打开一个 Github 仓库,是这个 2.x 导入工具的插件最新版本。

看 README 中的更新说明,正好解决了按钮不能点击的问题,以及其他 BUG 的修复。

果断下载插件安装上,再次尝试使用 Hellow World 工程导入 3.x 引擎 Button 点击问题解决!
4. 升级 3.x 脚本代码
UI 完美再现......OK
组件脚本节点绑定在......OK
组件属性、节点引用、组件方法调用一切 OK!
但是,这时点击游戏中的按钮是没有反应的,看代码如下:

从上图可以看到,升级工具将所有代码函数体全部注释起来了,现在要做的就是将所有函数体一个个地放开。
在 2.x 时使用的 cc.xxx 这种写法不能再用了,必须在脚本顶部做导入模块导入:
//从 cc 模块中解构出 Node、Sprite 变量
import { Node, Sprite } from 'cc'
在使用 VSCode 编写代码时,并不需要我们手动一个个敲 import 引入的模块,编辑器会自动添加,看下面:

小结
从 Creator 2.x 移植 3.x 的整体过程,主要为下面四步:
- 升级项目到 2.4.10 或最新版;
- 移植脚本到 TypeScript;
- 在 Creator 3.x 中使用 2.x 项目导入工具(注意使用github上的最新版本);
- 修改 3.x 项目中不兼容 2.x 的相关接口代码。
后续我还会有更多 Creator 2.x 升级 3.x 的经验分享,如果本文对你有用,感谢点赞留言!
更多精彩请关注Creator星球游戏开发社区
如何优雅地升级一个Creator 2.x 项目到 3.6.2 ?的更多相关文章
- 如何简单而优雅地升级Visual NMP中的PHP版本
需求:自己想测试下不同版本的PHP性能,就想升级下 Visual 这个集成环境中PHP的版本 网上: 升级PHP到5.6.11 1.下载新的nts版的PHP并解压缩到bin\PHP下,保留原文件夹的名 ...
- 如何优雅地关闭一个socket
最近在windows编程时需要考虑到“如何优雅地关闭一个socket”,查阅了一些资料,现将查到的相关资料做个汇编,希望能对后来者有所帮助(比较懒,所以英文资料没有翻译:-)) 1. 关闭Socket ...
- 如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下). 在一个月黑风高的夜晚,我思前想后,觉得再也不能 ...
- 用MVC5+EF6+WebApi 做一个小功能(三) 项目搭建
一般一个项目开始之前都会有启动会,需求交底等等,其中会有一个环节,大讲特讲项目的意义,然后取一个高大上的项目名字,咱这是一个小功能谈不上项目,但是名字不能太小气了.好吧,就叫Trump吧.没有任何含义 ...
- react全家桶从0搭建一个完整的react项目(react-router4、redux、redux-saga)
react全家桶从0到1(最新) 本文从零开始,逐步讲解如何用react全家桶搭建一个完整的react项目.文中针对react.webpack.babel.react-route.redux.redu ...
- 从0开始,手把手教你用Vue开发一个答题App01之项目创建及答题设置页面开发
项目演示 项目演示 项目源码 项目源码 教程说明 本教程适合对Vue基础知识有一点了解,但不懂得综合运用,还未曾使用Vue从头开发过一个小型App的读者.本教程不对所有的Vue知识点进行讲解,而是手把 ...
- 《从零开始做一个MEAN全栈项目》(3)
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 上一篇文章给大家讲了一下本项目的开发计划,这一章将会开始着手搭建一个MEAN项目.千里之行,始于足下, ...
- 《从零开始做一个MEAN全栈项目》(2)
欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 上一节简单介绍了什么是MEAN全栈项目,这一节将简要介绍三个内容:(1)一个通用的MEAN项目的技 ...
- 如何使用maven建一个web3.0的项目
使用eclipse手动建一个maven的web project可能会有版本不合适的情况,例如使用spring的websocket需要web3.0什么的,不全面的修改可能会出现各种红叉,甚是苦恼.我从我 ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
随机推荐
- get,post,put,delete四种基础方法对应增删改查
PUT,DELETE,POST,GET四种基础方法对应增删改查 1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数 ...
- DevOps|从特拉斯辞职风波到研发效能中的不靠谱人干的荒唐事
今天发生了一件大事特拉斯辞任英国首相,我想借着这件事情说下我看到的一件研发效能的荒唐事,这其中的关联也许就是「都用了不靠谱的人」. 两件事情 今儿一早就听到,2022年10月20日英国第78任首相伊丽 ...
- LcdToos如何在线对屏进行读写指令调试
在实际屏调试过程中,工程师经常需要对屏的寄存器频繁进行参数修改和读取测试,LcdTools针对这个做了很好的支持,可以在线进行指令调试,大大提高调试效率. 打开点屏工程,连接PX01并使模组上电点亮. ...
- Arctic 基于 Hive 的流批一体实践
背景 随着大数据业务的发展,基于 Hive 的数仓体系逐渐难以满足日益增长的业务需求,一方面已有很大体量的用户,但是在实时性,功能性上严重缺失:另一方面 Hudi,Iceberg 这类系统在事务性,快 ...
- 二十九、Helm常用命令
# 创建一个chart范例 helm create HELM-NAME # 检查chart语法 helm lint ./HELM-NAME # 使用默认chart部署到k8s helm install ...
- .NET 7 中 LINQ 的疯狂性能提升
LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的 ...
- js把秒数转换为HH:MM:SS及时分秒格式
/** * 转为HH:MM:SS * @param second * @returns {string} * @private */ var _showTime = function (second) ...
- Mybatis:解决调用带有集合类型形参的mapper方法时,集合参数为空或null的问题
此文章有问题,待修改! 使用Mybatis时,有时需要批量增删改查,这时就要向mapper方法中传入集合类型(List或Set)参数,下面是一个示例. // 该文件不完整,只展现关键部分 @Mappe ...
- 第一章 计算机和C++简介
1.1 简介 C++是一种强大的计算机面向对象编程的程序设计语言,它是制造软件的一种编程语言,适合程序员和刚接触编程的技术人员.当今智能手机销量爆炸式增长给移动应用程序的开发带来了很多机会,而C++就 ...
- C温故补缺(三):存储类声明符(auto,register,extern,static)
auto,register,extern,static 四个存储类声明符,用于定义变量/函数的作用域和声明周期 ① auto:自动变量,即普通变量,在平时定义变量时会自动赋予其auto类型 被auto ...