signed

QiShunwang

“诚信为本、客户至上”

Unity(4)-物理引擎

2021/4/26 18:08:35   来源:

b站学习笔记
链接:https://www.bilibili.com/video/BV12s411g7gU?p=177
在这里插入图片描述
物理引擎:模拟真实世界中物体物理特性的引擎。

刚体

刚体组件可使游戏对象受物理引擎控制,在受外力时产生真实世界中的运动。
属性
在这里插入图片描述

  • 质量Mass:物体的质量。

  • 阻力Drag:当受力移动时物体受到空气阻力。0表示没有空气阻力,极大时可使物体停止运动,通常砖头0.001,羽毛设置为10。

  • 角阻力AngularDrag:当受扭力旋转时物体受到的空气阻力。0表示没有空气阻力,极大时使物体停止旋转。

  • 使用重力UseGravity:若激活,则物体受重力影响。

  • 是否是运动学Is Kinematic:若激活,该物体不再受物理引擎控制,而只能通过变换组件来操作。

  • 插值Interpolate:用于缓解刚体运动时的抖动。
    无None–不应用插值。
    内插值Interpolate–基于上一帧的变换来平滑本帧的变换。
    外插值Extrapolate–基于下一帧的预估变换来平滑本帧变换。

  • 碰撞检测Collision Detection:碰撞检测模式。快速移动的刚体在碰撞时有可能互相穿透,可以设置碰撞检测频率,但频率越高对物理引擎性能印象越大。
    不连续Discrete:不连续碰撞检测。适用于普通检测(默认模式)。
    连续Continuous:连续碰撞检测。
    动态连续ContinuousDynamic:连续动态碰撞检测,适用于高速物体。

  • 约束Constraints:对刚体运动的约束
    冻结位置FreezePosition:刚体在世界中沿所选X,Y,Z轴的移动,将无效。
    冻结旋转Freeze Rotation:刚体在世界中沿所选的X,Y,Z轴的旋转,将无效。

碰撞器

  • 使刚体具有碰撞效果
  • 可以单独作用于物体,但是要使移动的物体具有碰撞效果必须附加刚体组件。
    在这里插入图片描述
分类
  • 静态碰撞器 Static Collider:只有碰撞器没有刚体的物体;
    现象:保持静止或者轻微移动,如:平面/树木
  • 刚体碰撞器Rigidbody Collider:具有刚体和碰撞的物体;
    现象:完全受物理引擎影响。
  • 运动学刚体碰撞器:带刚体,且勾选Is Kinematic,此碰撞器不能添加力,只能通过transform移动。
属性
  • 是否触发器Is Trigger:如激活,此碰撞器处于触发事件,并且被物理引擎忽略。
  • 材质Material:引用何种物理材质决定了他和其他对象如何作用。
  • 凸起的Convex:不激活则网格碰撞器间没有碰撞效果;
  • Mesh网格:用于碰撞所引用的网格。
物理材质

用于调整碰撞对象的摩擦力和反弹效果。

属性

  • 动态摩擦力Dynamic Friction:移动时摩擦力。
  • 静态摩擦力Static Friction:静止时摩擦力。
  • 弹力(Bounciness):反弹程度。
    备注:摩擦力、弹力建议0–1之间
  • 摩擦力合并模式Friction Combine Mode、合并反弹Bounce Combine:两个碰撞对象摩擦力/弹力的合并方式
    平均值Average 最小Min 最大Max 相乘Multiply

碰撞条件

  • 两者具有碰撞条件
  • 运动的物体具有刚体组件

碰撞三阶段

  • 当进入碰撞时执行
    void OnCollisionEnter(Collision collOther)
  • 当碰撞体与刚体接触时每帧执行
    void OnCollisionStay(Collision collOther)
  • 当停止碰撞时执行
    void OnCollisionExit(Collision collOther)

实例
在这里插入图片描述
脚本放在asteroid02上面

public class Bullet : MonoBehaviour
{
    //当满足碰撞条件
    //接触的第一帧执行
    private void OnCollisionEnter(Collision collision)
    {
        //事件参数类
        //获取对方碰撞器组件collision.collider.GetComponent<?>
        print("OnCollisionEnter----"+collision.collider.name);
    }
}

运行结果:在这里插入图片描述

触发器

带有碰撞器组件,且Is Trigger属性被勾选的物体。
现象:无碰撞效果。
在这里插入图片描述
触发条件

  • 两者具有碰撞条件
  • 其中之一带有刚体组件
  • 其中之一勾选isTrigger

触发三阶段

  • 当进入碰撞时执行
    void OnTriggerEnter(Collision cldOther)
  • 当碰撞体与刚体接触时每帧执行
    void OnTriggerStay(Collision cldOther)
  • 当停止碰撞时执行
    void OnTriggerExit(Collision cldOther)
    实例
    在这里插入图片描述
public class Bullet : MonoBehaviour
{
    //当满足碰撞条件
    //接触的第一帧执行
    private void OnCollisionEnter(Collision other)
    {
        //事件参数类
        //other:获取对方碰撞器组件collision.collider.GetComponent<?>
        print("OnCollisionEnter----"+other.collider.name);
    }

    //当满足触发条件
    //接触的第一帧执行
    private void OnTriggerEnter(Collider other)
    {
        //other:就是对方碰撞器组件other.GetComponent<?>
        print("OnTriggerEnter----"+other.name);
    }
}

运行结果:
在这里插入图片描述
碰撞和触发,满足触发条件执行触发。