目录
1.2 3D物体的碰撞效果(加刚体后是否勾选Is Kinematic)
本篇文章来进一步学习刚体和碰撞器,并来区分一下碰撞和触发的条件与阶段。可以先了解一下Unity类图和常用组件4.掌握Unity类图,快速了解常用组件(超详细)
1.RigidBody(刚体):
RigidBody使游戏对象能够受物理引擎的影响,在收到外力是产生真实世界中的运动,如重力、力和碰撞反应。物理引擎是模拟真实世界中物体物理特性的引擎。
1.1 3D物体的碰撞效果(加、不加刚体)
1)默认的3D物体是有Collider的,两个默认的3D物体移动碰撞,无物理效果,发生穿透。
2)给其中一个加上刚体,受物理引擎的影响,由于重力往下降。取消重力后,让该物体与默认物体碰撞,该物体避开默认物体,并受物理引擎影响,被撞飞,而另一个不受任何影响。
3)两个都加上刚体,都取消重力后,让他们进行碰撞,因为都有刚体受物理引擎的影响,所以都被撞飞。
1.2 3D物体的碰撞效果(加刚体后是否勾选Is Kinematic)
1)将A,B两个默认的3D物体均加上刚体且取消重力,A勾选Is Kinematic(Kinematic运动学的),当A去碰撞B时,A会停下,B会动起来;当B去碰撞A时,B会避开A,且B受物理引擎影响,会被撞飞,表现为B被A弹开,而A不受影响。
因此当需要物理引擎检测A,B两物体是否发生碰撞,检测到碰撞后,又不想要其中某个物体A运动(即不想要A有碰撞效果),则物体A需要加上带刚体,并勾选Is Kinematic。如打高尔夫球时,杆击球后,杆不动,此时杆就需要加上带刚体,并勾选Is Kinematic
2)当带刚体的勾选Is Kinematic的物体A,碰撞不带刚体的物体C时,A会穿透C,C撞A时,C也会穿透A
1.3 那什么时候给物体加刚体呢?
①在玩家可移动的范围内,会被碰撞的物体需加刚体,即需要有物理碰撞效果
②不需要物理效果,但需要物理引擎来检测是否碰撞(接触)
2.Collider(碰撞器):
Collider 定义了一个物体的碰撞体积,用于检测和处理碰撞。不同类型的Collider适用于不同的形状和用途。用于物理碰撞检测和触发器事件。
1.1碰撞器
碰撞器可以使刚体具有碰撞效果。
1)碰撞器的分类:
①静态碰撞器Static Collider:只有碰撞器没有刚体的物体现象,保持静止或者轻微移动,如:平面/树木
②刚体碰撞器Rigidbody Collider:具有刚体和碰撞器的物体现象,完全受物理引擎影响
③运动学刚体碰撞器:带刚体且勾选Is Kinematic,此碰撞器不能添加力,只能通过transform移动。
2)碰撞条件
①两者均具有Collider碰撞组件
②其中运动的物体具有RigidBody刚体组件(物理引擎只检测刚体)
原则:若两者都移动,综合考虑给数量少的物体刚体,提高性能;碰撞体能选方形就选方形,性能较好
3)碰撞三阶段
①当进入碰撞时执行void OnCollisionEnter(Collision collision)
②当碰撞体与刚体接触时每帧执行void OnCollisionStay(Collision collision)
③当停止碰撞时执行void OnCollisionExit(Collision collision)
4)举例
A,B两物体均有Collider碰撞组件,A具有RigidBody刚体组件,并给A挂上脚本,为更好地看到效果,均取消重力
using UnityEngine;
public class Test03_A : MonoBehaviour
{
/// <summary>
/// 当进入碰撞时执行
/// </summary>
/// <param name="collision">B物体</param>
private void OnCollisionEnter(Collision collision)
{
Debug.Log("OnCollisionEnter()被调用,collision.name为"+collision.collider.name);
}
/// <summary>
/// 当碰撞体与刚体接触时每帧执行
/// </summary>
/// <param name="collision">B物体</param>
private void OnCollisionStay(Collision collision)
{
Debug.Log("OnCollisionStay()被调用,collision.name为" + collision.collider.name);
}
/// <summary>
/// 当停止碰撞时执行
/// </summary>
/// <param name="collision">B物体</param>
private void OnCollisionExit(Collision collision)
{
Debug.Log("OnCollisionExit()被调用,collision.name为" + collision.collider.name);
}
}
1.2触发器
1)触发器的定义
触发器是带有Collider碰撞组件,且Is Trigger被勾选的物体。触发器不会启动物理引擎,无碰撞效果,更节省性能。
2)触发条件
①两者均具有Collider碰撞组件
②其中一个带有刚体组件
③其中一个勾选Is Trigger
3)触发三阶段
①当碰撞体进入触发器时执行
②当碰撞体与触发器接触时每帧执行
③当停止触发时执行
4)举例
A,B均具有Collider碰撞组件,A加上刚体组件,B勾选Is Trigger,并给B挂上脚本,勾选Is Trigger
using UnityEngine;
public class Test03_B : MonoBehaviour
{
/// <summary>
/// 当碰撞体进入触发器时执行
/// </summary>
/// <param name="other"></param>
private void OnTriggerEnter(Collider other)
{
Debug.Log("OnCollisionEnter()被调用,other.name为" + other.name);
}
/// <summary>
/// 当碰撞体与触发器接触时每帧执行
/// </summary>
/// <param name="other"></param>
private void OnTriggerStay(Collider other)
{
Debug.Log("OnTriggerStay()被调用,other.name为" + other.name);
}
/// <summary>
/// 当停止触发时执行
/// </summary>
/// <param name="other"></param>
private void OnTriggerExit(Collider other)
{
Debug.Log("OnTriggerExit()被调用,other.name为" + other.name);
}
}
5)触发器的应用
①想要检测是否发生碰撞,但不要碰撞效果
②想要知道在角色指定半径范围内的所有敌人,一个物体可以有多个碰撞器
总之,有刚体组件的物体受物理引擎的影响;有碰撞器组件的物体,勾选Is Trigger就成为了触发器,不勾选就是碰撞器。牢记碰撞条件(①两者均具有碰撞组件②其中运动的物体具有刚体组件)和触发条件(①两者均具有撞组件②其中一个带有刚体组件③其中一个勾选Is Trigger)。注意OnTriggerEnter和OnCollisionEnter互斥,执行其中一个,另一个不会执行
好了,今天的分享到这里就结束啦,希望对你有所帮助,给自己点个赞吧,优秀~,记得多看几遍,加深理解~