Unity 物理系统 -- 碰撞体简介(碰撞、触发条件)

Unity 物理系统 -- 碰撞体简介(碰撞、触发条件)

几个常用的碰撞体:

  1. Box Collider:盒碰撞体,盒碰撞体是一个立方体外形的基本碰撞体,该碰撞体可以调整为不同大小的长方体,可用作门、墙、以及平台等
    面板属性如下:
    Is Trigger:触发器,勾选该项,则该碰撞体可用于触发事件,并将被物理引擎所忽略
    Material:材质
    Center:中心,碰撞体在对象局部坐标中的位置
    Size:大小,碰撞体再X、Y、Z方向上的大小
     
  2. Sphere Collider:球形碰撞体,球形碰撞体是一个基于球体的基本碰撞体,球体碰撞体的三维大小可以均匀等地调节,但不能单独调节某个坐标轴方向的大小
    Radius:半径,球形碰撞体的大小
     
  3. Capsule Collider:胶囊碰撞体,胶囊碰撞体由一个圆柱体和与其相连的两个半球体组成,是一个胶囊形状的基本碰撞体,胶囊碰撞体的半径和高度都可以单独调节,可用在角色控制器或与其他不规则形状的碰撞结合来使用
    Height:高度,该项用于控制碰撞体中圆柱的高度
    Direction:方向,在对象的局部坐标中胶囊的纵向方向所对应的坐标轴,默认是Y轴
     
  4. Mesh Collider:网格碰撞体,网格碰撞体通过获取网格对象并在其基础上构建碰撞,在与复杂网格模型上使用基本碰撞相比,网格碰撞体要更加精细,但会占用更多地系统资源
    Smooth Sphere Collisions:平滑碰撞,在勾选该项后碰撞会变得平滑
    Mesh:网格,获取游戏对象的网格并将其作为碰撞体
    Convex:凸起,勾选该项,则网格碰撞体将会与其他的网格碰撞体发生碰撞
    Wheel Collider:车轮碰撞体,车轮碰撞体是一种针对地面车辆的特殊碰撞体,它有内置的碰撞检测、车轮物理系统以及滑胎摩擦的参考体
    Suspension Distance:悬挂距离,该项用于设置车轮碰撞体悬挂的最大伸长距离,按照局部坐标来计算,悬挂总是通过其局部坐标的Y轴延伸向下
    Center:中心,该项用于设置车轮碰撞体在对象局部坐标的中心
    Suspension Spring:悬挂弹簧,该项用于设置车轮碰撞体通过添加弹簧和阻尼外力使得悬挂达到目标位置
    Forward Friction:向前摩擦力,当轮胎向前滚动时的摩擦力属性
    Sideways Friction:侧向摩擦力,当轮胎侧向滚动时的摩擦力属性
     
  5. character controller组件属性
    Character Controller,角色控制器,角色控制器主要用于对第三人称或第一人称游戏主角的控制,并不使用刚体物理效果
    Slope Limit:坡度限制,该项用于设置所控制的角色对象只能爬上小于或等于该参数值的斜坡
    Step Offset:台阶高度,该项用于设置所控制的角色对象可以迈上的最高台阶的高度
    Skin Width:皮肤厚度,该参数决定了两个碰撞体可以相互渗入的深度,较大的参数值会产生抖动的现象,较少的参数值会导致所控制的游戏对象被卡住,较为合理地设定上是:该参数值为Radius值的10%
    Min Move Distance:最小移动距离,如果所控制的角色对象的移动距离小于该值,则游戏对象将不会移动
    Center:中心,该参数决定了胶囊碰撞体再世界坐标中得位置,
    Radius:半径,胶囊碰撞体的长度半径,
    Height:高度,该项用于设置所控制的角色对象的胶囊碰撞体的高度

碰撞与触发分别对应的三种函数方法

系统默认会给每个对象(GameObject)添加一个碰撞组件。而在Unity中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛,为了完整的了解这两种方式,我们必须理解以下概念:

  1. 碰撞器是一群组件,它包含了很多种类,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
  2. 所谓触发器,只需要在Inspector检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
  3. 在Unity中,主要有以下接口函数来处理这两种碰撞检测:

触发信息检测:

  • MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
  • MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
  • MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

碰撞信息检测:

  • MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
  • MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
  • MonoBehaviour.OnCollisionStay( Collision collisionInfo ) 当逗留碰撞器

碰撞检测条件:

  1. 两个物体都有Collider
  2. 至少有一个物体挂载Rigidbody
  3.  Collider上都不勾选Is Trigger

触发检测条件:

  1. 两个物体都有Collider
  2. 至少有一个物体挂载Rigidbody
  3.  所挂脚本物体勾选Is Trigger (有一个勾选了就可以)
public class collider : MonoBehaviour 
{

    //--------------碰撞器--------------
    private void OnCollisionEnter(Collision collision)
    {   
        //打印碰撞到物体的名称
        Debug.Log(collision.gameObject.name);      
        //获取碰撞到物体的Render组件并且更改其材质球颜色
        collision.gameObject.GetComponent<Renderer>().material.color = Color.red;
    }

    private void OnCollisionStay(Collision collision)
    {
        Debug.Log(collision.gameObject.name);
        collision.gameObject.GetComponent<Renderer>().material.color = Color.blue;
    }

    private void OnCollisionExit(Collision collision)
    {
        Debug.Log(collision.gameObject.name);
        collision.gameObject.GetComponent<Renderer>().material.color = Color.green;
    }
    
    //--------------触发器--------------  勾选isTrgger  
    private void OnTriggerEnter(Collider other)
    {
        //打印引起触发的物体名称
        Debug.Log(other.name);
        //改变自己的颜色
        GetComponent<Renderer>().material.color = Color.red;
    }

    private void OnTriggerStay(Collider other)
    {
        GetComponent<Renderer>().material.color = Color.blue;
    }

    private void OnTriggerExit(Collider other)
    {
        GetComponent<Renderer>().material.color = Color.green;
    }

}

 
### 回答1: 这里提供一个简单的示例代码,用于在 Unity 中处理碰撞消失的情况: ```csharp void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "消失物标签") { Destroy(collision.gameObject); } } ``` 在这个示例代码中,当物碰撞器发生碰撞并且碰撞的游戏对象具有特定标签时,会将该游戏对象销毁。你可以将标签和销毁逻辑更改为符合你的需求。 ### 回答2: Unity碰撞消失代码的实现可以通过以下步骤: 1. 创建两个游戏对象,一个是碰撞器所在的物,另一个是需要消失的物。 2. 给碰撞器所在的物添加一个Collider组件,可以选择使用Box Collider、Sphere Collider或其他合适的碰撞器类型。 3. 在碰撞器所在的物上添加脚本,可以通过点击物,在Inspector窗口中点击Add Component按钮,选择New Script来创建一个新的脚本。 4. 在脚本中编写OnCollisionEnter函数,该函数会在碰撞器与其他物发生碰撞时自动调用。 ```csharp void OnCollisionEnter(Collision collision) { // 判断碰撞的物是否为需要消失的物 if (collision.gameObject.tag == "DisappearObject") { // 销毁需要消失的物 Destroy(collision.gameObject); } } ``` 5. 给需要消失的物标记一个Tag,例如"DisappearObject",以方便在代码中判断是否为需要消失的物。 6. 将脚本挂载到碰撞器所在的物上。 上述代码会在碰撞器与其他物发生碰撞时检测到是否为需要消失的物,如果是,则销毁该物。你可以根据实际情况进行修改和扩展。 ### 回答3: 在Unity中实现碰撞消失的代码可以分为以下几个步骤: 1. 创建一个碰撞检测脚本。首先,我们需要在Unity中创建一个C#脚本,可以将其附加到我们想要进行碰撞检测的对象上。可以通过右键点击对象,在弹出菜单中选择"Create Empty"来创建一个空的GameObject,然后在Inspector窗口中点击"Add Component"按钮,并添加一个新建的脚本。 2. 实现OnCollisionEnter()方法。在脚本中,我们需要实现OnCollisionEnter(Collider other)方法。这个方法会在对象发生碰撞时被调用。我们可以在这个方法中编写使对象消失的代码。例如,可以使用Destroy()函数销毁对象:Destroy(gameObject)。这样当对象与其他物发生碰撞时,对象就会消失。 3. 添加碰撞器组件。为了让对象能够参与碰撞检测,我们需要为其添加一个碰撞器组件。在Unity中有很多种碰撞器组件可供选择,例如Box Collider、Sphere Collider等。可以根据对象的形状选择适当的碰撞器组件,并添加到脚本所附加的对象上。 4. 设置碰撞器的触发模式。默认情况下,碰撞器是物理碰撞器,需要物之间有物理交互才能检测到碰撞。如果只需要检测碰撞而不需要物理交互,可以选择将碰撞器的触发模式设置为触发器。在碰撞器组件的Inspector窗口中将Is Trigger属性勾选即可。 以上就是在Unity中实现碰撞消失效果的基本代码。通过编写适当的碰撞检测脚本并将其附加到需要消失的对象上,以及添加合适的碰撞器组件和设置触发模式,就可以实现碰撞后对象消失的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈言必行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值