基本上想和Unity 对象交互,都是以唯一的引擎方式来处理的,包括按钮的触碰,游戏人物的互动
这里就按照box2d物理引擎来说一下怎么让物体真实的放到引擎中。
刚体 Rigidbody
首先是物体的刚体 Rigidbody,在物理世界里,需要让对象成为一个刚体。默认只支持刚体,软体其实也是刚体来模拟的。
包括三种类型:
Dynamic - 灵活活动,能受到外力影响的对象,现实世界里你能看到的大部分都是这个类型
Kinematic - 动态,能对此种物体直接设置位置等固定,或者制作成关卡机关,不受到外力影响自身状态。
static - 静态,纯静止状态,地面就是这种属性。
simulated不勾选则此对象不在物理世界内有效
碰撞器 Collider
光有刚体还是不够的,刚体和刚体之间需要有相互影响。这就需要了Collider碰撞器。
刚体的外形形状,就决定了碰撞器如何来碰撞。这在box2d中是相反的,创建box2d时形状是随着刚体一起创建,而碰撞器则是制作成了事件触发器,而不是像unity这样把碰撞和形状结合在一起。
碰撞器并不一定真的需要发生碰撞, Is Trigger的话是改碰撞为触发器。
如何让sprite在刚体碰撞时不旋转?
Freeze Rotation Z 不是可以锁定吗,但是如果你这么设置的话碰撞和摩擦效果会和解锁完全不一样,会卡在很奇怪的位置。
使用下面代码解决此问题,
//在对象的update()中添加
transform.rotation = Quaternion.Euler(0, 0, 0);
材质 Material
- 可以通过新建PhysicMaterial后在 rigidbody 和 collider中选择。
- 代码方式设置
//创建材质
PhysicsMaterial2D defMaterial = null;
defMaterial = new PhysicsMaterial2D ("defMaterial");
defMaterial.friction = 0;
defMaterial.bounciness = 50;
//获得碰撞器并设置
Collider2D cd = GetComponent<Collider2D> () as Collider2D;
cd.sharedMaterial = defMaterial;
碰撞的相互依赖
Edit / Project Setting / PhysicsSetting(or 2d)
这里设置了ball1层和ball2层不碰撞
如何让物理对象结组
当你想要上手开发时,会发现每个物体都和周围的东西相互有交互,虽然通过layer可以屏蔽互相碰撞关系,但这并不是我想要的。我要的是把几个对象,做成一个整体。
- 子对象拥有碰撞器 Collider,不设置刚体
- 整体拥有一个刚体 RigidBody
如何给对象添加连续作用力
//创建
cf = gameObject.AddComponent<ConstantForce2D> ();
cf.force = new Vector2 (.5f,.5f);
cf.torque = 10;
//停止
cf.enabled = false;
如何给对象添加瞬间作用力
Rigidbody2D rb = gameObject.AddComponent<Rigidbody2D> ();
rb.gravityScale = 0; //屏蔽了重力,用于突出显示作用力
rb.AddForce(new Vector2(10.5f,10.5f));
碰撞事件
- 3D
//碰撞开始
MonoBehaviour.OnCollisionEnter( Collision collisionInfo )
//碰撞退出
MonoBehaviour.OnCollisionExit( Collision collisionInfo )
//碰撞进行中
MonoBehaviour.OnCollisionStay( Collision collisionInfo )
- 2D
//碰撞开始
MonoBehaviour.OnCollisionEnter2D( Collision2D collisionInfo )
//碰撞退出
MonoBehaviour.OnCollisionExit2D( Collision2D collisionInfo )
//碰撞进行中
MonoBehaviour.OnCollisionStay2D( Collision2D collisionInfo )
参考:https://www.cnblogs.com/417LDS/p/6040430.html
触发事件
- 3D
//触发开始时
MonoBehaviour.OnTriggerEnter( Collider other )
//触发退出时
MonoBehaviour.OnTriggerExit( Collider other )
//触发进行时
MonoBehaviour.OnTriggerStay( Collider other )
- 2D
//触发开始时
MonoBehaviour.OnTriggerEnter2D( Collider2D other )
//触发退出时
MonoBehaviour.OnTriggerExit2D( Collider2D other )
//触发进行时
MonoBehaviour.OnTriggerStay2D( Collider2D other )
参考:https://www.cnblogs.com/417LDS/p/6040430.html
为何 OnTriggerEnter 触发了两次
当两个碰撞对象都是trigger,那么就执行两次,如果其中一个是trigger,则执行一次,如果都不是,则执行 OnCollisionEnter
停止物理运动
Time.timeScale = 0;