实战 Creator 2.x 项目升级 3.x!避坑要点与基础 API 写法差异总结

news2024/12/23 22:37:09

最近,我将自己在 Cocos Store 上的一个 2D 项目《球球要回家》从 Creator 2.2.2 升级到 Creator 3.6.2,编程语言也从 JavaScript 全面升级至 TypeScript 并适配微信小游戏,目前在微信审核中!

本篇文章就来跟大家分享一下,我在升级过程中踩到的一些坑,以及 2.x 与 3.x 中引擎最基本的一些接口的变化。

不论你是升级老项目,还是想尝试在 Creator 3.x 上新开项目,相信本文都能对你有所帮助!

一、2.x项目升级流程

1. 升级引擎到 2.4.x

如果你是 2.4.x 以下的老项目,建议先将项目升级到 2.4.x 最新引擎版本。

如果有出现警告什么的,可以暂时不管他,引擎会提示你那些方法、属性废弃了,用什么接口去替换。只需要将真正被废弃的接口改掉,保证项目正常运行就好。

根据我这一两年参与CocosStore资源上架审核测试工作来看 95% 的项目,可以不用任何改动升级到 2.4.x。

2. 脚本升级

Creator 3.x 仅支持使用 TypeScript 做为组件脚本。

因此,如果你之前是用 Javacript 编写的组件脚本,还需要将它们翻译为 TypeScript。这一步是个体力活动,一是翻译脚本,二是将脚本重新挂载节点。

我的做法是,比如:看到有个脚本为:GameScene.js,先在它旁边生成一个 GameSceneTS.ts 照着 js 代码逻辑,按 ts 语法重写一遍代码。

582a5898d50a61d1d6efaa173c0380bf.png

虽然这是个体力活,但是在 VSCode 中写 ts 代码还是很享受的,智能提示非常的方便。

如果发现代码提示,并没像我说的那么友好!那请注意,你可以通过引擎主菜单开发者VSCode 工作流更新或导入creator.d.ts提示文件,如图:

d103600801dfd4f54df66c6069c7bc55.png

ts 脚本翻译完后,就要开始在编辑器上进行替换了。

但是,如何找到之前使用的 js 脚本,在那些地方使用过呢?看下图:

1a46afdd3bcd620ee084124827a1ffa5.png

在资源管理器中,鼠标右键选中脚本文件,在菜单中点击找查使用可以找到资源使用过的场景预制体

不过问题又来了,场景那么多节点,组件脚本在那里呢?这个怎么找?

3390ff6c9f8b12b8774585decbba9f1e.png

在这里分享一个小技巧,在层级管理器的搜索栏中输入:t:组件名字 就出来了!f40c3b7186b6fe8137a9857ccb8373f5.png

然后你就可以,将新的 ts 脚本挂到节点上,并照之前 js 组件属性值,配置 ts 组件参数了。

1a22f45052ada332641d1848f3c0104f.png

ts 组件属性设置完后,将 js 版的组件移除,进行测试。这样操作,可以最大程度保证项目与之前逻辑一致,不容易出问题。

将所有组件替换完毕后,将 js 脚本从资源管理器上移除,再将 ts 脚本名后缀的 xxxTS 拿掉。

《球球要回家》从 2.2.2 升级到 2.4.10 过程中,除了将代码脚本从 js 迁移到 ts 外,我还将所有的 cc.Action 动作改写为了 cc.Tween,为后续升级 3.x 做好充分准备。

3. 升级 Creator 3.x 工程

重点来了,我们的目标是将 2.2.2 项目顺利升级到 3.6.2 上。

新建一个 Creator 3.x 工程,从编辑器主菜单上 文件导入 Cocos Creator 2.x 项目

f6f5231abcf1daf504ba8d47bcaaaf61.png

浏览到准备升级的 2.x 工程目录,会弹出下面这样一个面板。

3a8fd96c2b2c15a4d98db4b1ee7aa325.png

注意:这里有一个坑点!我最初在导入球球要回家 2.4.10 工程后发现,场景中的 Button 按钮点不动。

为了排除是因为脚本引起的问题,我使用 2.4.10 重新建了一个 Hello World 工程,添加上Button按钮,再导入 3.6.2 依然有这个问题,

试了多次无解决,我再停下来看导入面板上的说明,打开一个 Github 仓库,是这个导入工具的插件版本。

5ab935897dc835a0d37b6e46ee9ffb23.png

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

5da867a4b830deef182712a541373686.png

果断下载插件安装上,再次尝试使用 Hellow World 工程导入 3.x 引擎 Button 点击问题解决!

4. 升级 3.x 脚本代码

使用插件版本导入工具,导入完毕,我感觉有点心跳加速,小心翼翼地打开几个游戏场景和预制体!惊呆了!

UI完美再现......OK
组件脚本节点绑定在......OK
组件属性、节点引用、组件方法调用一切OK!
难道这就成功呢吗?

我按捺住激动的心,尝试着运行一下,跑起来了!

可是!点击下按钮,仅仅弹动一下,但就没有然后了。

我赶紧打开脚本看看,发现是这样一个光景:所有代码中的函数体,都被注释起来了!

82496f53d819c876803416c6ec043c74.png

这时我才意识到,正真的 3.x 升级工作现在才开始!

二、2.x 升级 3.x 组件代码调整

1. 模块引入

在 Creator 3.x 中废弃了cc.Nodecc.Sprite 这种形式的 API 调用。取而代之的是,先在脚本顶部做import模块,代码如下:

//从 cc 模块中解构出 Node、Sprite 变量
import { Node, Sprite } from 'cc'

其实在使用 VSCode 编写代码时,并不需要我们手动一个个敲import引入的模块,看下面:

b3cd9af82d70138881e4729579ee834c.gif

脚本中首次使用引擎模块时,它会自动 import 的,如果你有出现上面招数不灵,可以尝试通过 3.x 引擎主菜单开发者Export.d.ts安装 VSCode 提示文件。

cdfc9326cd67b708a1774c1c17a05f8e.png

2. Node 属性的变化

Creator 3.x 中 Node 的属性变的极其的简洁了,只剩下positionrotationscale 保留。

fb964b5d8564ad1ce4583cc0d680f2df.png

那其它的属性到去了呢?我们在 3.x 场景中添加一个2D精灵,你可以看到:

0ffbb82631fb3473ed9fa44d9a60c29e.png
  1. opacity 属性移到cc.UIOpacity组件

  2. color 属性移到cc.Sprite组件

  3. size、anchor point 属性移到cc.UITransform组件

c429635fc1869e95eecc4cfdef5d98fa.png

因此之前的 node.opacity、node.scale、node.color、node.width,这些接口都不能使用了,取而代之的是下面这些样的接口方法:

设置节点透明度

//Creator 2.x
this.node.opacity = 200;

//Creator 3.x
this.node.getComponent(UIOpacity).opacity = 200;

设置节点颜色

//Creator 2.x 
this.node.color = cc.Color.RED;

//Creator 3.x
this.node.getComponent(Sprite).color = Color.RED;

设置节点 size

//Creator 2.x
this.node.setContentSize(100, 100);

//Creator 3.x 
let transform = this.node.getComponent(UITransform);
//使用方法设置节点大小
transform.setContentSize(100, 100)
//也可以使用contentSize属性
transform.contentSize = Size(100, 100);
//还可以使用width、height属性
transform.width = 100;
transform.height = 100;

虽然 3.x 中 Node 的 position、scale、rotation 属性还在,但代码接口也有所变化,我们来看下他们的区别。

设置节点位置

//Creator 2.x
this.node.position = v2(100, 100)
this.node.x = 100;  //3.x中不可用
this.node.y = 100;  //3.x中不可用

//Creator 3.x 中不能使用x、y、z分量设置节点位置
//需要使用 position 属性或 setPosition 方法
this.node.position = v3(100, 100, 100);
//注意需要同时设置 xyz 三个分量
this.node.setPosition(100, 100, 100);

设置节点缩放

//Creator 2.x
this.node.scale = 1.5;

//Creator 3.x 
//注意 scale 不在是一个 number 而是 Vec3
this.node.scale = v3(1.5, 1.5, 1.5);
//注意 需要同时设置 xyz 三个分量
this.node.setScale(1,1,1);

设置节点在二维上的旋转

//Creator 2.x rotation 属性在 2.3.x 之后是使用 angle 属性
this.node.angle = 1.5;

//Creator 3.x
//节点的 rotation 属性其实是一个 Quat 类型
//2D节点在属性检查器中的 rotation 
//对应的是节点的 angle 属性
this.node.angle = 10
//也可以使用 eulerAngles 来设置,注意它是设置的Z轴的旋转
this.node.eulerAngels = v3(0, 0, 10);

节点坐标转换

还有,在 2D 中常用的节点坐标转换 convertToNodeSpaceAR、convertToWorldSpaceAR、getBoundingBox 这些接口移到了 UITransform 组件对象上了,看代码:

//Creator 2.x 
let p = this.node.convertToNodeSpaceAR(eventTouch.location);

//Creator 3.x
let transform = this.node.getComponent(UITransform);
let location = eventTouch.location;
//注意 3.x 中convertToNodeSpaceAR的参数为 Vec3 类型
//但 location 为 Vec2 类型
let p = transform.convertToNodeSpaceAR(v3(location.x, location.y));

Tween 动画

在 Creator 2.x 中 Tween 动画主要是控制节点的位移、旋转、缩放、透明度、颜色等属性。移植到 Creator 3.x 后要注意的是:

  1. 有些属性已经不在 Node 对象上了,需要获取相关组件来控制

  2. 位移、旋转、缩放属性使用 Vec3 类型而非 Vec2,不然会出现一些意想不到的问题。

像下面这个场景,关卡按钮出现时,做了一个缩放动画。9f4013cd333a2a98c06e17aef17af174.gif

代码是这样写的:

...
let node = item.node;
tween(node)
  .to(0.1, { sacle: v2(1.1, 1.1) }) //放大
  .to(0.1, { sacle: v2(1, 1)})      //还原
  .start();

运行效果也都正常,但是!按钮无法响应点击事件... 通过各种排查才发现,是写的 Tween 动画造成的,于是改成下面这样:

...
let node = item.node;
tween(node)
  .to(0.1, { sacle: v3(1.1, 1.1) }) //放大
  .to(0.1, { sacle: v3(1, 1)})      //还原
  .start();

将 v2 改成 v3 立马就正常了,就这样一个小小的问题,搞了半天。

节点层级

在 2.x 中Node.zIndex是用来控制节点显示层级,数值越大在最底层。

而在 3.x 中Node.zIndex接口已被废弃,需要使用Node.setSiblingIndex() 方法,与 2.x 是相反的,数值最小的在最底层。

winSize

2.x 中还有一个高频接口 cc.winSize 在 3.x 中也不存在了,对应的API为view.getContentSize() 获取窗口设计分辨率大小。

import { view } form 'cc'
view.getVisibleSize()

编辑器加载资源

项目中,有时我们会用到编辑器内资源加载,什么意思呢?

就是说希望在编辑器状态就能看一些界面效果,而不用跑H5预览运行。而且使用到的图片资源,并不是在编辑器中手动拖放的,而是用代码加载。

fde900363a4e709477bc385da735a10f.gif

图中,通过GameBoard组件的Level属性切换关卡编号,可看直接看到场景变化。不会的同学可能会问,这是怎么做到的呢?

  1. 为组件脚本添加executeInEditMode装饰器

import { _decorator } from 'cc';
const {ccclass, executeInEditMode} = _decorator;

@ccclass('GameBoard')
@executeInEditMode //添加编辑器模式执行
export default class GameBoard extends Component {
  onLoad() {
    //代码将在编辑器状态执行
  }
  start() {
    //代码将在编辑器状态执行
  }
  update() {
    //代码将在编辑器状态执行
  }
}

注意,在编辑器中执行代码可能会出现一些副作用,比如对象未初化、update被频繁调起。2.x 这时你可以使用 CC_EDITOR 变量做检查,代码如下:

//Creator 2.x 使用 CC_EDIDTO 全局变量检查
update() {
  if (CC_EDITOR) {
    return;
  }
  ...
}

3.x中已经不存在全局CC_EDITOR,而是在cc/env模块下代码如下:

//Creator 3.x 使用 EDITOR 变量检查
import { EDITOR } from 'cc/env';
...
update() {
  if (EDITOR) {
    return;
  }
  ...
}

  1. 编辑器中加载资源

//Creator 2.4.x 加载图集中的图片
//注意'path'为resouces目录文件路径
cc.resources.load(path, SpriteAtlas, (err, res) => {
  let sprite = this.getComponent(Sprite);
  sprite.spriteFrame = res.getSpriteFrame(this.imageName);
});

在 3.x 中Bundle目录下的资源,不能在编辑器状态下被加载,因此需要将文件移出resouces目录,并使用assetManager.loadAny这个万能加载API,代码如下:

//Creator 3.x 加载图集中的图片
assetManager.loadAny({uuid:'xxx', type: SpriteAtlas}, (err, res) => {
  let sprite = this.getComponent(Sprite);
  sprite.spriteFrame = res.getSpriteFrame(this.imageName);
})

在我的测试中使用 assetManager.loadAny({{uuid:...}})这种接口形式加载成功。如果获得资源UUID,看下图:

02e212a41c05be32992f0dcb59b544b3.jpeg

三、小结


从 Creator 2.x 移植 3.x 的整体过程,大概就下面三步:

  1. 将代码移植 ts 并升级到 2.4.x,如果项目已经是 2.4.x ts 那恭喜你,可以跳过这一步;

  2. 在 3.x 编辑器中使用 2.x 项目导入功能(注意要使用插件哦)将 2.x 升级到 3.x,这一步主要解决了 UI 重做的问题;

  3. 修改 3.x 中不兼容 2.x 的相关接口,基本上是一对一翻译,注意 3.x 首先它是 3D 引擎,大量接口已经变成 Vec3。

希望上面 2.x 升级 3.x 内容对你有所帮助,也感谢在双11期间支持《球球要回家》的老铁们,这将是 Cocos Store 上第二个同时支持 Creator 2.x 、3.x 的游戏源码资源。所有之前支持过的用户,都可以免费下载!

体验链接:
http://gameview.creator-star.cn/zxh/ball-game-ccc3.6.2/index.html

下载地址:
https://store.cocos.com/app/detail/2648


往期精彩

  • 麒麟子免费3D角色虚拟摇杆控制器!这也太好用了

  • 这样的一个人,他是如何能独立做吃鸡的!

  • 微信小游戏构建发布指南!5分钟视频教程

  • Creator 3.x 资源加密方案!支持Web与原生

  • 微信小游戏超4M怎么办?小游戏包体优化方案

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

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

相关文章

发布3天获推荐10w+,视频号内容出现新玩法?

上月,腾讯发布Q3季度财报,视频号也被重点提及,广告主对其早前上线的原生信息流广告需求强劲,像首批投放的阿玛尼等品牌的广告还曾引起过不少讨论。用户对视频号广告的关注热度高,也从侧面说明,视频号目前的…

大数据流批一体

流批一体的内涵 流批一体中的“流批”是指流处理与批处理,是两种不同的数据处理方式,而不是对数据种类的划分。具体来说,数据可以按产生的时间划分为历史数据与实时数据,亦可按数据的明细程度分为流水数据与切片数据;数…

VS2022环境下C++ DLL动态链接库的编写和调用

一、编写DLL动态链接库 1、新建动态链接库项目 2、新建类 3、宏定义 #ifdef DLL_API # define DLL_API _declspec(dllexport) # else # define DLL_API _declspec(dllimport) #endif 4、使用宏定义修饰类 /*h*/ #pragma once#ifdef DLL_API # define DLL_API _declspec(dl…

ad2019--LED灯按键类创建元件库

摘自凡亿教育 一、LED灯按键类创建元件库 1.绘制LED灯的原理图库 鼠标右击箭头所指的,然后选择倒数第三个,多边形 在画的时候可以按住,shift空格,来调整角度。 但是,一般的LED灯都是蓝色的,我们可以把它…

用MybatisPlus代码生成器生成代码

作者简介 作者名:编程界明世隐 简介:CSDN博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注&…

用帝国主义竞争算法(ICA)求解旅行商问题(TSP)(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

两大产品上线“粤复用”,赋能大数据智能行业发展

为深入贯彻落实国家《关于加强数字政府建设的指导意见》关于数字政府应用“一地创新、各地复用”的部署要求,促进优秀应用成果快速、可靠、低成本地复用推广,正式上线广东数字政府应用超市——“粤复用”。据悉,“粤复用”应用超市汇聚各级政…

spring-aop源码分析(2)_AnnotationAwareAspectJAutoProxyCreator后置处理器

本文将通过阅读AnnotationAwareAspectJAutoProxyCreator后置处理器的源码,分析其解析AOP通知、匹配切入点和创建AOP代理的流程。 入口 AnnotationAwareAspectJAutoProxyCreator是一个BeanPostProcessor实现,他在容器进行initializeBean的时候被调用&am…

[附源码]计算机毕业设计汽车美容店管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

TDH社区版上新宽表数据库Hyperbase,轻松实现海量数据的毫秒级精确检索

日前,为了降低用户接触使用大数据技术的门槛以及成本,星环科技推出TDH社区版(Transwarp Data Hub Community Edition)来帮助企业用户、高校师生、科研机构以及其他专业开发人更简单、更便捷的进行大数据分析。为了满足更多用户在存…

IT统一运维软件发展趋势浅析

在企业IT数字化转型趋势下,为支撑业务敏捷、稳定、创新发展,IT运维的重要性已日益凸显。伴随着IT运维管理目标、管理范围、管理对象及管理深度的转变,IT运维平台建设呈现管理一体化、规模扩大化、业务可视化、运维自动化、运维智能化的关键趋…

成功实施企业内容管理(ECM)的 5 个技巧

成功实施企业内容管理(ECM)的 5 个技巧 俗话说,唯一不变的就是变化。在您不懈努力发展业务的过程中,您需要改变业务流程、不断升级产品、使用技术实现自动化、让您的员工和客户满意。 改变管理方式是实施企业内容管理的一个关键考…

Vue Element UI 中 el-table 树形数据 tree-props 多层级使用避坑

实现效果: element官网提示设置tree-props为{children: ‘children’,hasChildren: ‘hasChildren’},data数据需要设置children和hasChildren属性,row-key也绑定了数据的唯一值变量id,但是树形结构的第三级就是出不来 如图 可以…

02、交换机

目录 1.、Exchange(交换机)的作用 2、Exchange(交换机)的类型 2.1.直连交换机:Direct Exchange 2.2.主题交换机:Topic Exchange 2.3.扇形交换机:Fanout Exchange 2.4.首部交换机:Headers exchange 2.5.默认交换机 2.6.Dead…

MySQL基础三问:底层逻辑、正在执行、日志观察

背景及目录: 经常面试会遇到且实际工作中也会应用到的三个场景: 一.mysql查询时的底层原理是什么? 二.如何查看正在执行的mysql语句? 三.如何观察mysql运行过程中的日志信息? - - - - - - - - - -分割线- - - - -…

【html5期末大作业】基于HTML+CSS+JavaScript管理系统页面模板

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

pyinstaller 操作以及常见问题解决

最近有需要用pyinstaller打包 直接上命令: pyinstaller -F xxx.py -w -i img.ico-F 指定需要打包的主文件,-w是让打包后的exe,运行不再出现cmd框,一般打包都会加上,-i 是指定打包后的图标ico文件 在线生成ico链接&am…

(14)点云数据处理学习——RGBD 里程计

1、主要参考 (1)官网 RGBD Odometry — Open3D 0.16.0 documentation 2、原理和实现 2.1 RGBD Odometry主要作用 RGBD里程计在两个连续的RGBD图像对之间查找相机运动。输入是RGBDImage的两个实例。输出是刚体变换形式的运动。Open3D实现了[Steinbruc…

Transformer——台大李宏毅详讲Transformer

文章目录李宏毅老师讲TransformerEncoderDecoderDecoder整体逻辑non-autoregressiveDecoder中的Cross Attention训练Seq2seq的一些Tips老师讲的超级棒,激动哭了: 视频链接:台大李宏毅21年机器学习课程 self-attention和transformer 李宏毅老师…

Mac版Word设置从第K页开始显示页码

tags: Word Tips 写在前面 最近有同学问我怎么在word文档中从第四页开始设置页码, 也就是首页以及第二页第三页的说明页都不编页码, 从第四页开始页码为1, 然后往后编号这种. 一开始我以为直接在页码设置处就有这个选项的(毕竟写东西几乎不用word, 也不熟悉), 后来发现还是t…