Unity 物理引擎

基本上想和Unity 对象交互,都是以唯一的引擎方式来处理的,包括按钮的触碰,游戏人物的互动

这里就按照box2d物理引擎来说一下怎么让物体真实的放到引擎中。

刚体 Rigidbody

首先是物体的刚体 Rigidbody,在物理世界里,需要让对象成为一个刚体。默认只支持刚体,软体其实也是刚体来模拟的。
包括三种类型:
Dynamic - 灵活活动,能受到外力影响的对象,现实世界里你能看到的大部分都是这个类型
Kinematic - 动态,能对此种物体直接设置位置等固定,或者制作成关卡机关,不受到外力影响自身状态。
static - 静态,纯静止状态,地面就是这种属性。


Unity 物理引擎_第1张图片
image.png

simulated不勾选则此对象不在物理世界内有效

碰撞器 Collider

光有刚体还是不够的,刚体和刚体之间需要有相互影响。这就需要了Collider碰撞器。
刚体的外形形状,就决定了碰撞器如何来碰撞。这在box2d中是相反的,创建box2d时形状是随着刚体一起创建,而碰撞器则是制作成了事件触发器,而不是像unity这样把碰撞和形状结合在一起。


Unity 物理引擎_第2张图片
image.png

碰撞器并不一定真的需要发生碰撞, Is Trigger的话是改碰撞为触发器。

如何让sprite在刚体碰撞时不旋转?

Freeze Rotation Z 不是可以锁定吗,但是如果你这么设置的话碰撞和摩擦效果会和解锁完全不一样,会卡在很奇怪的位置。
使用下面代码解决此问题,

//在对象的update()中添加
transform.rotation = Quaternion.Euler(0, 0, 0);
image.png

材质 Material

  • 可以通过新建PhysicMaterial后在 rigidbody 和 collider中选择。
  • 代码方式设置
//创建材质
PhysicsMaterial2D defMaterial = null;
defMaterial = new PhysicsMaterial2D ("defMaterial");
defMaterial.friction = 0;
defMaterial.bounciness = 50;

//获得碰撞器并设置
Collider2D cd = GetComponent () as Collider2D;
cd.sharedMaterial = defMaterial;
image.png

碰撞的相互依赖

Edit / Project Setting / PhysicsSetting(or 2d)
这里设置了ball1层和ball2层不碰撞


Unity 物理引擎_第3张图片
image.png

如何让物理对象结组

当你想要上手开发时,会发现每个物体都和周围的东西相互有交互,虽然通过layer可以屏蔽互相碰撞关系,但这并不是我想要的。我要的是把几个对象,做成一个整体。

  • 子对象拥有碰撞器 Collider,不设置刚体
  • 整体拥有一个刚体 RigidBody

如何给对象添加连续作用力

//创建
cf = gameObject.AddComponent ();
cf.force = new Vector2 (.5f,.5f);
cf.torque = 10;
//停止
cf.enabled = false;

如何给对象添加瞬间作用力

Rigidbody2D rb = gameObject.AddComponent ();
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;

你可能感兴趣的:(Unity 物理引擎)