CocosCreator3D初体验总结

项目是20年10月底时候做的,拖到现在才写下这篇体验总结…会迟到但不缺席
下面开始了
首先使用的引擎是CocosCreator3D 1.2.0
目标平台是oppo、vivo、微信等小游戏平台

由于是第一次使用3d引擎,在使用上和2d还是有蛮大区别的(只写了使用到的部分
1、 UI的layer需要设置为 UI_2D。
2、所有组件名称都加了一个Component后缀。
3、action被废弃,只能使用tween。
4、opacity透明度变为了单独的一个组件,需要额外增加一个透明度组件才能使用。
5、导入UI图片需要修改图片类型为sprite-frame,否则无法在UI里使用。
6、动态加载图片资源,路径最后需要加入 /spriteFrame后缀。
7、ts里cc.xxx会报错,但实际可以使用。
8、audioEngine被废弃了…

下面是遇到的一些问题以及解决的办法
1、穿模问题
运动物体是一个胶囊体,静态物体主要有两种BoxCollider和MeshCollider。
我们针对这三种碰撞体做了处理(大大提高Collider的强度但不能百分百防止穿模情况)
1、BoxCollider
将过长的BoxCollider拆分成多个短小的BoxCollider。
2、MeshCollider
1、拆分成多个convex mesh(Mesh的碰撞远不如convex的高效和稳定)。
2、不使用MeshCollider,拆分成多个基础平面collider(比如box、sphere)。
3、运动物体脚本添加以下代码(开启子弹模式的碰撞检测)
if (window[‘CC_PHYSICS_AMMO’]) {
const Ammo = window[‘Ammo’];
const rb = this.getComponent(RigidBodyComponent);
rb.body.impl[‘useCCD’] = true;
const co = Ammo.castObject(rb.body.impl, Ammo.btCollisionObject);
co[‘wrapped’] = rb.body;
co[‘useCCD’] = true;
(rb.body.impl as any).setCcdMotionThreshold(0.0000001);
(rb.body.impl as any).setCcdSweptSphereRadius(0.1);
}
2、阴影问题
我们是一个横板跑酷类游戏,场景长度很长
本来采用的是全局光照,按照教程配置后运行根本看不到阴影,这是由于光源位置比较远而且比较高所以就误以为没有生效。
解决方式:采用光源跟随的方式,因为shadow map的分辨率是有限的,全局使用阴影效果会比较差,而且光源范围越小性能越好。
3、性能问题
因为我们目标平台是各大小游戏平台,而小游戏平台由于不支持wasm所以对物理库性能支持不够好。
后来做了一系列优化
1、将mesh collider简化为更简单的Collider,比如box和sphere。然后叠加一部分mesh collider。
2、对collider和renderer做动态开关,只有接近角色的collider才开启renderer才渲染,人物经过后再关闭collier和渲染。
4、其他问题
1、剔除内面的模型需要设置cullmode:none(正背面渲染,会损耗性能)。
2、使用多个基础形状拼接成mesh形状后不支持父节点非均匀缩放,是因为目前物理无法同步父节点的transform,只会同步collider自身节点的transform。

2赞