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;
    }

}

 
首先,在Unity中触碰到某一碰撞需要使用Collider组件和Rigidbody组件,其中Collider负责检测碰撞,Rigidbody负责处理物理运动。 接下来,我们需要编写一个脚本来实现触碰到某一碰撞触发场景跳转的功能。步骤如下: 1. 在Unity中创建一个空对象,命名为SceneManager; 2. 在SceneManager对象上添加一个Box Collider组件,并勾选Is Trigger选项,这个Collider将作为触发器来检测碰撞; 3. 在SceneManager对象上添加一个脚本,命名为SceneManagerScript; 4. 在SceneManagerScript脚本中编写代码,实现触碰到碰撞触发场景跳转的功能,代码如下: ``` using UnityEngine; using UnityEngine.SceneManagement; public class SceneManagerScript : MonoBehaviour { private void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "Player") // 判断是否是主角Player碰撞触发 { SceneManager.LoadScene("Scene2"); // 加载场景Scene2 } } } ``` 解释一下代码: - OnTriggerEnter是Unity自带的碰撞事件函数,当其他物进入触发器时,就会自动调用这个函数。 - Collider other表示与触发器发生碰撞的其他物。 - if (other.gameObject.tag == "Player")表示判断是否是主角Player碰撞触发,tag可以在Inspector面板中设置。 - SceneManager.LoadScene("Scene2")表示加载场景Scene2。 5. 将SceneManagerScript脚本挂载到SceneManager对象上。 这样,当主角Player触碰到SceneManager对象上的触发器时,就会触发场景跳转,跳转到Scene2场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈言必行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值