• Unity3D之碰撞体,刚体


    一 概念介绍

    刚体

    Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。

    碰撞体

    碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

    二 属性

    刚体Rigidbody组件的属性

    Mass质量 该项用于设置游戏对象的质量(建议在同一个游戏场景中,游戏对象之间的质量差值不要大于100倍)。

    Drag阻力 0表示没有空气阻力,阻力极大时游戏对象会立即停止运动。

    Angular Drag角阻力 当游戏对象受扭矩力旋转时受到的空气阻力。0表示没有空气阻力,阻力极大时游戏对象会立即停止运动。

    Use Gravity使用重力 开启此项,游戏对象受重力影响。

    Is Kinematic是否开启动力学 开启此项,游戏对象将不再受物理引擎的影响从而只能通过Transform(几何变换组件)属性来对其操作,该方式适用于模拟平台移动或带有铰链关节链接刚体的动画。

    Interpolate插值 该项用于控制刚体运动的抖动情况。有三项可以选择:

    • None没有插值
    • Interpolate内插值,基于前一帧的Transform来平滑此次的Transform。
    • Extrapolate外插值,基于下一帧的Transform来平滑此次的Transform。

    Collision Detection碰撞检测 该属性用于控制避免高速运动的游戏对象穿过其他对象而未发生碰撞,有三项可以选择:

    Discrete离散碰撞检测 该模式与场景中其他的所有碰撞体进行碰撞检测,是默认值。

    • Continuous连续碰撞检测 该模式用于检测与动态碰撞体(带有Rigidbody)的碰撞,使用连续碰撞检测模式来检测与网格碰撞体的(不带Rigidbody)碰撞。其他的刚体采用离散碰撞模式。此模式适用于那些需要与采用连续动态碰撞检测的对象相碰撞的对象:这对物理性能会有很大的影晌 ,如果不需要对快速运动的对象进行碰撞检测,就使用离散碰撞检测模式。
    • Continuous Dynamic连续动态碰撞检测模式 该模式用于检测与采用连续碰撞模式或连续动态碰撞模式对象的碰撞 ,也可用于检 测 没 有Rigidbody的静态网格碰撞体 。 对于与之碰撞的其他对象可采用离散碰撞检测。 动态连续 碰撞检测模式也可用于检测快速运动的游戏对象。

    Constraints约束 该项用于控制刚体运动的约束。

    • Freeze Position:冻结位置。刚体对象在世界坐标系中xyz轴方向上(勾选状态)的移动无效。
    • Freeze Rotation:冻结旋转。刚体对象在世界坐标系中xyz轴方向上(勾选状态)的旋转无效。

    使用刚体

    刚体在受物理引擎作用之前必须要明确地添加给一个游戏对象,之后该对象就会受到重力和通过脚本添加的作用力的影响。

    举个例子吧:比如让一个小球碰撞一个立方体。

                                   

    首先要给小球添加一个刚体组件Rigidbody,确定"Use Gravity"和"Is Kinematic"(是否动力学)为取消状态,即不使用重力模拟和确保受到物理力学的影响。

    由于创建一个球体时,Unity会默认添加了一个Sphere Collider,所以不需要再添加碰撞体。

    现在为小球添加一个脚本(C#)用来控制小球的移动和碰撞检测。

    脚本代码如下:

    using UnityEngine;
    using System.Collections;
    
    public class OperateBall : MonoBehaviour
    {
    
        public float speed;//控制小球的移动速度
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            float moveHorizontal = Input.GetAxis("Horizontal");
            float moveVertical = Input.GetAxis("Vertical");
            Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
            rigidbody.AddForce(movement * speed * Time.deltaTime);
        }
    
        void OnTriggerEnter(Collider other)
        {
            if (other.gameObject.tag == "pickup")
            {
                other.gameObject.SetActive(false);//如果是立方体,碰撞后设为禁用,在Game中就不会显示
            }
        }
    }

    接着来设置一下cube立方体的属性,确保Box Collider中的"Is Trigger"选项被勾选上。

    Is Trigger为选中状态,表明cube是一个触发器,当小球碰撞它是会触发小球脚本(BallControl.cs)中OnTriggerEnter的事件,接下来cube就会被禁用,不会显示在Game中。

    如果不选中Is Trigger,那么则无法用脚本来控制小球的移动。

    碰撞前:

    碰撞后:

    注意

    触发事件,必须满足如下三个条件:

    1、必须都要有碰撞器组件(Collider)。

    2、必须有一个物体带刚体组件,并且处于运动状体中(包括主动运动去撞击别人和在运动过程中被别人撞击)。

    3、两个碰撞器中至少有一个开启了IsTrigger。

  • 相关阅读:
    一题多解 —— 同时找到序列的最大值最小值
    中位数与顺序统计量
    软件开发 —— 极限编程(XP:Extreme Programming)
    一题多解 —— 二项式分布的期望和方差的计算
    C++中explicit关键字用法
    【联系】二项分布的对数似然函数与交叉熵(cross entropy)损失函数
    随机变量统计独立性的相关证明
    PowerShell管理SCOM_批量设置维护模式(下)
    导出AD用户所属组,查询AD用户(aduser)
    SQL脚本运行
  • 原文地址:https://www.cnblogs.com/tgycoder/p/4847409.html
Copyright © 2020-2023  润新知