cocos creator 2.4 升级到 3.5 总结

之前游戏都是在2.4版本开发的。发现2.*系列后面不在维护,于是将引擎升级到了3.5。现把升级过程中遇到的函数变化列出来供有需要的同学参考

官方说明v3.0 升级指南 · Cocos Creator

坐标:
node上掉了x,y属性,position.x和position.y是只读属性,不能直接赋值
升级前:
node.x=1, node.y=1
升级后:
node.position.x, node.position.y,
node.setPosition(1, 1)
nodeT.layer = CC.Layers.Enum.UI_2D // 新Node记得添加该属性,否则节点不会显示出来

缩放:
node的scale不能直接赋值为整数
升级前:
node.scale = 1
升级后:
node.scale = new Vec3(1, 1, 1);

颜色:
node去掉了color属性, 需要通过修改组件color属性来修改
升级前:
node.color = (new cc.Color()).fromHEX(“F5B963”)
label.outlineColor = (new cc.Color()).fromHEX(“F5B963”)
升级后:
node.getComponent(Sprite).color = (new cc.Color()).fromHEX(“F5B963”);
node.getComponent(Label).color = (new cc.Color()).fromHEX(“F5B963”);
label.node.getComponent(CC.LabelOutline).color = (new cc.Color()).fromHEX(“F5B963”)

宽度和高度:
node上去掉了opacity属性,创建node会自动增加UITransform组件
升级前:
node.width = 600
升级后:
node.getComponent(UITransform).width = 600

透明度:
node上去掉了opacity属性,创建node不会自动增加UIOpacity组件
升级前:
node.opacity = 255
升级后:
node.getComponent(UIOpacity).opacity = 255;

Tween:
x,y属性不能单独赋值,scale不能直接赋值一个整数, opacity要通过UIOpacity组件属性来修改。
以下一条写法要改为两条写法

升级前:
cc.tween(node).to(MoveTime, {x: tPosx, y: tPosy, scale: tScale, opacity: 0}).call(()=>{console.log("over")}).start();
升级后:
cc.tween(node).to(MoveTime, {position: new Vec3(tPosx, tPosy), scale: new Vec3(tScale, tScale)}).call(()=>{console.log("over")}).start();

cc.tween(node.getComponent(UIOpacity)).to(MoveTime, {opacity:0}).call(()=>{console.log("over")}).start();

zIndex:
注意:从 v3.1 开始,priority 属性已弃用,若需要调整节点树的顺序请使用 setSiblingIndex 方法。值越小越靠前

坐标:
世界坐标系的点:
以屏幕左下原点的坐标。注意世界坐标系并非单纯的依据屏幕像素坐标生成的。Canvas的宽高会根据ProjectSettings中ProjectData 中的数值与屏幕像素坐标做自适应拉伸。
举例: 如屏幕宽640,高960, 同时设置宽度固定。在屏幕像素为375812生成的世界坐标宽为640, 高为640/375812=1385.8
屏幕左下角的世界坐标为(0, 0), 屏幕正中间的世界坐标为(320, 692.9), 屏幕右上角的世界坐标为(640, 1385.8)
坐标点转化:

BNode.getComponent(UITransform).convertToNodeSpaceAR(AWorldPosition): AWorldPosition为世界坐标,将其转化为相对于BNode锚点的坐标
BNode.getComponent(UITransform).convertToWorldSpaceAR(APosition): APosition为相对于BNode锚点的坐标,将其转化为世界坐标

触点坐标:
使用event.getUILocation()获取的坐标为世界坐标
this.node.on(CC.Node.EventType.TOUCH_START, function(event:CC.EventTouch) {
	let pos1 = event.getUILocation();
	console.log("[TestConvert] %s", pos1.toString());
}, this);

材质:
spine动画的shader赋值:
this.aniComponent.customMaterial = this.grayMaterial;

未定义属性:
比如需要对Node增加属性noColor, 会报错 Property ‘noColor’ does not exist on type ‘Node’
解法1 使用断言强制执行:(node as any).noColor = true;
解法2 使用字符方式获取对象属性:node[“noColor”] = true;

获取精灵点击次数
旧: itemCom.node.getNumberOfRunningActionsInTarget()
新: CC.TweenSystem.instance.ActionManager.getNumberOfRunningActionsInTarget(itemCom.node as CC.Node);

17赞

66666 冲!!!

字错了

感谢~我改下

手上俩项目 2.4.10 3.6.1 正好需要这样的对照信息啊!
感谢啦!

坨坨的变得写代码不爽了 :flushed:,感觉等原生化完,出稳定版,升引擎才靠谱

主要是常用的x,y,scale,width,height,opacity,color获取和赋值变得不容易。。。

node.color 可以这么写node.getComponent(UIRenderer).color


这个嘛,其实这样说不合适
应该说这个函数是设置节点在同级节点中的下标,最小是0,最大是同级节点数-1

这东西嘛,坑的很

很有意义的帖子

战略mask

感谢分享~~~

是啊常用的,不过应该可以自己去封装下

之前从egret转过来的,最近在做项目,发现一点,在egret白鹭引擎里面一个pixelHitTest属性,实现图片像素点击, 在cocos creator要费好大劲才能实现~? 相关参数设置3.X也那么费劲,好不习惯,要不是白鹭不更新了,估计也不会随便换引擎

1赞

button组件升级好像有问题,
2.x 的scale只有x,y两个属性,3.x有x,y,z三个属性
转换后,x,y的值都是1, z的值是0, 这样就点击不了。
要把z手动改成1才能点击

2赞

指的是3.x 导入2.x项目吗?

刚才用3.4.2测了一下,发现还是有这个问题了
从2.4.9转换
有的项目出现,有的项目不出现。
prefab里出现的次数比较多,scene里出现的次数少
x=1, y=1,z=0

https://github.com/cocos/cocos-plugin-import-2.x

你更新一下插件,在试看看

如果是维护很久的项目工程,先别升,再等几个补丁版本。信我!

赞同,前两天2.4x升级3.61,已经头疼了,不升级了搁置了