5.刚体与碰撞器详解,区分碰撞与触发(超详细)

目录

1.RigidBody(刚体):

1.1 3D物体的碰撞效果(加、不加刚体)

1.2 3D物体的碰撞效果(加刚体后是否勾选Is Kinematic)

1.3 那什么时候给物体加刚体呢?

2.Collider(碰撞器):

1.1碰撞器

1)碰撞器的分类:

2)碰撞条件

3)碰撞三阶段

4)举例

1.2触发器

1)触发器的定义

2)触发条件

3)触发三阶段

4)举例

5)触发器的应用


       本篇文章来进一步学习刚体和碰撞器,并来区分一下碰撞和触发的条件与阶段。可以先了解一下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互斥,执行其中一个,另一个不会执行

        好了,今天的分享到这里就结束啦,希望对你有所帮助,给自己点个赞吧,优秀~,记得多看几遍,加深理解~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值