刚体就是具有物理属性的物体,拥有重力,会自由落体等。
选中游戏物体→Component→Physics→Rigidbody,该物体就会成为刚体,受到重力的影响:
例如图中红圈部分不是刚体,没有下落。
另外的两个是刚体,发生了掉落和碰撞。
Rigidbody(刚体)
组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。
用来模拟一个物体受到力作用时的表现,如图中参数,Mass质量,Drag阻力等。
碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。
包括不同的 Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet(就是里面的模型)身上。
例子:
Box Collider:盒子碰撞体(骨骼):
形状是立方体,用于包裹类似“立方体”的模型,例如门、盒子等
组件属性:
Center:骨骼的中心点
Size:骨骼的大小
Mesh Collider: 网格碰撞体,万能碰撞体,可以用于包裹所有复杂的模型(可能需要自己配置该组件)
组件属性:
Mesh:根据指定的网格,生成碰撞体骨骼
普通的球形骨骼:
网格骨骼:
在Collider面板勾选IS Trigger将其设为触发器。
碰撞事件:
当一个用刚体控制
的物体与另外一个物体碰撞时,就会触发碰撞事件(目标物体必须带有 Collider
组件),比如一款射击类游戏,发射出的子弹可能会射中敌人也可能会射中箱子,我们就需要监测这个碰撞。
碰撞事件监测方法:
OnCollisionEnter(Collision): 当碰撞开始时调用,只会调用该方法一次
OnCollisionExit(Collision):当碰撞结束时调用,只会调用该方法一次
OnCollisionStay(Collision):当碰撞进行中时,会持续调用该方法
Collision参数:一个类,用于传递碰撞信息对象
Collision.gameObject属性:当前物体碰撞的物体的引用(是被碰撞的物体)
例如子弹打到箱子上,假设这个脚本被绑定到子弹
上,那么得到的引用是箱子的信息,
gameObject.name属性:当前物体的名字
例子:
void OnCollisionEnter(Collision coll)
{
if (coll.gameObject.name != "Ground") //如果当前接触到的物体不是地面
Debug.Log("与物体" + coll.gameObject.name + "发生碰撞");
}
void OnCollisionStay(Collision coll)
{
if (coll.gameObject.name != "Ground")
Debug.Log("与物体" + coll.gameObject.name + "重合");
}
void OnCollisionExit(Collision coll)
{
if (coll.gameObject.name != "Ground")
Debug.Log("离开物体" + coll.gameObject.name);
}
当两个对象碰撞时,可能会发生许多不同的脚本事件,具体取决于碰撞对象的刚体配置。
碰撞事件
1.控制A(刚体加碰撞体)撞击 静止的B(只有碰撞体),双方能收到碰撞事件。
2.控制B(只有碰撞体)撞击 静止的A(刚体加碰撞体),双方收不到碰撞事件。
3.控制A(刚体加碰撞体)撞击 静止的B(刚体加碰撞体),双方能收到碰撞事件。
触发事件(均为控制A撞B) 选中碰撞体组件面板上的“Is Trigger”选项,就会转为触发器,转为触发器后,移动的刚体会穿透碰撞体。
1.A(碰撞体),B(没有碰撞体,无论有没有刚体),没有触发事件。
2.A(碰撞体),B(碰撞体),没有触发事件。
3.A(碰撞体和刚体,开启IsTrigger),B(碰撞体,关闭IsTrigger),双方都能收到触发事件。
4.A(碰撞体和刚体,关闭IsTrigger),B(碰撞体,开启IsTrigger),双方都能收到触发事件。
5.A (碰撞体,关闭IsTrigger),B(碰撞体和刚体,开启IsTrigger),没有触发事件。
6.A (碰撞体,开启IsTrigger),B(碰撞体和刚体,关闭IsTrigger),没有触发事件。
两个物体都必须带有碰撞器(Collider)
,其中运动的物体还必须带有Rigidbody刚体
。另外只要有一个是触发器,那么就无法触发碰撞体,也就是说必须两个都是碰撞体。触发器和碰撞体的属性是相悖的。
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性,
运动的那个必须是刚体,只要有一个是触发器,就可以实现触发检测,可以给A和B各挂一个脚本实现相互检测触发
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动、或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
。
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果,有种撞到墙上的感觉,你过不去,而且墙会告诉别人你撞到了墙上,
触发器: 人站在靠近门的位置门自动打开效果,通过了某个特殊的空气的感觉,空气会告诉别人你经过了这里。不与目标物体发生直接的碰撞,而是只要进入目标物体的“触发范围”就能执行某些特定操作。