这篇文章取材于Bad Piggies游戏,主要是来分析学习creator的一些物理特性。
项目准备
- 新建空白项目工程phys;
- 添加res、scripts、scenes文件夹;
- 导入图片资源在res目录下;
- 保存场景文件game到scenes目录下;
- 准备工作完毕。
功能实现
我们这里为了学习研究creator的物理特性,只有是从刚体、碰撞、关节等组件的属性来着手。
1.球在重力作用下的自由下落
刚体组件
这一点我们是模拟一个球,在重力作用下的下坠;与地面接触之后的弹起的效果。
- 先添加一个球ball;
- 再添加一个地面floor;
- 对ball添加刚体组件:添加组件----物理组件----RigidBody;
- 我们还需要在脚本中开启物理世界;
这里新建ts脚本,在onLoad()中添加下面代码;如果不开启,球不会受到物理作用。
onLoad () {
//开启物理世界
cc.director.getPhysicsManager().enabled = true;
}
到这里,球就实现了往下坠落的效果。
碰撞组件
刚体与刚体之间想要发生作用,需要添加碰撞体组件;这里我们添加一个圆形的碰撞体。
- 物理组件----Collider----Circle
- 设置碰撞体的半径:修改Radius,使他适合球形大小。
下面我们添加一个地面,是球坠下之后可以弹起。
- 添加单色精灵floor;
- 设置颜色#686464、大小960*50、位置(0,-280),如下;
- 添加刚体组件;
- 添加碰撞体组件
- 将地面的刚体类型设置成static,就不会受到重力的影响而下坠,会静止在那里。
- 调整球和地面的:摩擦系数Friction;
- 调整球和地面的:弹性系数Restitution;
可以看到球一直在下坠和弹起了。
2.BadPiggies游戏中小车的下坠和向前滑行
先来模仿BadPiggies游戏组建一个简单的车的样子,如下图;车在重力作用下会下坠,然后会自动调整成两轮向前滑行。
下面是给车的各个部件,添加物理组件;包括车身box、两个车轮架wheel_body、两个车轮wheel。
- 车身box添加刚体组件RigidBody;
- 连个车轮架子添加刚体组件RigidBody;
- 两个车轮添加关节组件Joint的Wheel属性
- 将连个车轮架子的资源拖到关节组件的Connected Body上;
- 调整wheel的关节节点组件里面的Connected Anchor的坐标位置。
- 调整两轮子的扭矩(加速度)Max Motor Torque和马达速度(最大速度)Motor Speed:
- 对两轮子添加圆形碰撞组件PhysicsCircleCollider,并设置半径Radius为轮子的半径,防止调到地面下了;
- 对车身box添加方形碰撞组件PhysicsBoxCollider;
- 车轮子没有转动,需要开启自动马达开关,在WheelJoint组件下的Enable Motor勾选;
- 将两车轮架子wheel_body添加关节组件joint的weld属性,并挂载在车身box上;车身和轮子就不会散架了;
- 调整wheel的WheelJoint组件里面的弹性系数Frequency为10,防止车轮架子塌下来;
- 车轮架子wheel_body旋转Rotation之后,对关节Joint的WeldJoint组件里面的属性相对角度Reference Angle进行设置;
- 对轮子架子wheel_body添加Collider多边形的碰撞体PhysicsPolygonCollider,使架子和车身不分开;
附:游戏中的一些物理属性:
//开启物理世界
cc.director.getPhysicsManager().enabled = true;
cc.director.getPhysicsManager().debugDrawFlags =
cc.PhysicsManager.DrawBits.e_aabbBit | //轴向外边框
cc.PhysicsManager.DrawBits.e_pairBit | //粗侧阶段物体
cc.PhysicsManager.DrawBits.e_centerOfMassBit | //质心位置
cc.PhysicsManager.DrawBits.e_jointBit | //关节链接信息
cc.PhysicsManager.DrawBits.e_shapeBit //碰撞盒
;
刚体 RigidBody
刚体 RigidBody
GetMass(); //质量,不可直接赋值,需要通过碰撞体组件的密度和大小计算得到
GravityScale//重力的影响大小
linearVelocity//线速度
linearDamping//线性衰减速度,空气摩擦力
angularVelocity//旋转速度
angularDamping//旋转衰减速度
enabledContactListener//碰撞监听
刚体类型 cc.RigidBodyType
刚体类型 cc.RigidBodyType
Static: 静态刚体,零质量、零速度,即不会受到重力或速度的影响;但是可以设置它的位置来进行移动。如:地面
Dynamic: 动态刚体,有质量,可以设置速度,会受到重力影响。如:弹球
Kinematic: 运动刚体,零质量,可以设置速度,不会受到重力的影响;但是可以设置速度来进行移动。
Animated: 动画刚体,从Kinematic衍生的类型,主要用于刚体与动画编辑结合使用。
物理碰撞形状
物理碰撞形状
Box 四边形
Chain 链条
Circle 圆形
Polygon 多边形
物理碰撞 PhysicsCollider
物理碰撞 PhysicsCollider
sensor 指明碰撞体是否为传感器类型,传感器类型的碰撞体会产生碰撞回调,但是不会发生物理碰撞效果。
density 碰撞体的密度,用于刚体的质量计算
friction 碰撞体摩擦力,碰撞体接触时的运动会受到摩擦力的影响
restitution 碰撞体的弹性系数,指明碰撞体碰撞时是否会受到弹力影响