给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更新了)