从零开始的unity2017笔记【2D】(【三】物理方面)

三、物理方面

给sprite对象加刚体(Rigidbody 2D)里面的【body type】中dynamic会让物体受重力影响,kinematic会让物体不受重力影响。

给对象再加碰撞体(box collider 2d、circle collider 2d等等之类)在其组件里面用edit collider调整碰撞体大小。

碰撞体中给“is trigger”打勾就表示这个碰撞体是一个触发器,其他碰撞体可以穿过他并且根据脚本触发事件。(因此在3d工程中如果有重力,该物体可能会直接掉到地面下面去)不打勾则是一个碰撞体,别的物体碰到他会被挡住。

刚体中constraints可以打勾控制冻结对象xy坐标或者旋转坐标。2D游戏中一般把人物的rotation Z冻结住,否则人物可能走着走着就摔倒起不来了。

mass设置对象重量。

上面菜单【Edit】-【project setting】-【physical】里面可以找到设置重力-9.81,避免人物像在月球上可以根据需求调整重力大小方向。

对刚体的控制:

获取对象刚体属性:

1、public Rigidbody2D m_rig;

2、public gameobject m_rig2;

      xxx=m_rgi2.GetComponent<Rigidbody2D>();【xxx获得刚体属性(这里暂时对2D游戏为例子)】

让某刚体去除物理效应:【比如csgo里面打死敌人后敌人布娃娃系统消失,尸体姿势保持不受其他物理碰撞影响】

m_rig.simulated = false;【也就是刚体属性里面simulated是否打勾,这个设为false后物体位置就固定了,等于是关闭了该对象物理模拟】

如何控制与特定的碰撞体碰撞才发生效果?

通过设置目标对象或者被碰对象的tag实现(也可以用layer设置可碰撞层与不可碰撞层),下面假设我要让当前物体与标签(tag)为enemy的对象碰撞才发生效果。

void OnTriggerEnter2D(Collider2D coll){

if(coll.tag==“enemy”

printf“碰到敌人了”

}【这种情况就只有碰到enemy标签的对象才会输出结果,否则什么事都不会发生】

给对象施加力:

public Rigidbody2D m_stand;//获取刚体对象
protected Vector2 force;//施加的力度

m_stand.GetComponent<Rigidbody2D>().AddForce(force, ForceMode2D.Impulse);

【利用addforce()函数给指定对象添加一个方向为force的力(力的大小和force里面xy的大小有关),impulse是瞬间推力,还有其他句柄是持续推力】

(2018/10/21更新了)

你可能感兴趣的:(从零开始的unity2017笔记【2D】(【三】物理方面))