【unity】【C#】物理系统和碰撞检验


Collider 碰撞系统

我们先创建一个由 cubesphere 组成的玩家构建,以及一个 capsule 胶囊体
在这里插入图片描述
到右边属性栏中点击 Add Component 在输入栏中输入 collider 碰撞,会发现出现许多的碰撞选项,有2D和3D之分,也有物体类型之分,这个碰撞选项是根据所创建创建好的实例构建形状选择的

这里的碰撞属性只是一个基础,必须如果要进行碰撞的话必须要进行设置的,但它不会单独地运行碰撞,必须要配合使用 rigidbody 刚体
在这里插入图片描述

rigidbody 刚体

同理在 Add Component 输入栏中输入 rigidbody 刚体,
在这里插入图片描述
这个 riigidbody 的内容选项如下图所示
在这里插入图片描述

我们先将 playeruse gravity 使用重力给勾选上,运行,会发现画面中被命名为 use gravity 的对象垂直下落

我们再对 player 进行如下设置, item 只添加 collider 组件,运行后,拖动 player 撞向 item 会产生下图状态, player 会因为撞向 item 而受到反作用力,向力的反方向运动,而 item 原地不动
在这里插入图片描述
同理,如果,我们为 item 设置了跟 player 一样的组件,我们会发现两个物体都向反方法运动
在这里插入图片描述
如果我们希望其中一个 player 不运动,但是能够将 item 推动甚至撞飞,可以勾选上 playeris kinematic 就可以了,但是这种情况下,如果我们拖拽 player 太快就会导致穿模现象,这种情况下,虽然 item 仍然会进行小型的移动,但是不会很明显
在这里插入图片描述

现在我们来了解一下 rigidbofy 上面几个数据的具体用途
分别是 质量 空气阻力 角阻力(控制旋转幅度)
在这里插入图片描述

我们将 playerdrag 空气阻力给设置到10,再运行撞向 item 会发现,item 的飞行速度明显快于 player

在这里插入图片描述
同理,如果我们遇到 player 因为撞击后虽然飞的比较慢,但是旋转的速度比较快,我们就可以把角阻力 angular drag 给增大,就可以肉眼可见地发现旋转幅度下降了,质量也是如此,只要根据现实生活中的运用去思考就行了,不放图过多赘述了

再往下看,这里的意思的约束,第一行用来约束对象的移动,第二行用来约束旋转,只要勾选上,该物体在碰撞过程中,勾选上的内容就不再会发生改变
在这里插入图片描述
再来理解一个概念 - 碰撞线,我们直接点击一个对象,在这个对象的表面会出现淡绿色的碰撞线,我们可以取消勾线该对象的 mash renderer 来暂时隐藏更好地去观察这个碰撞线

在这里插入图片描述
这个碰撞线是对象间碰撞的依据,可以随意改变,点击碰撞系统中的编辑按钮,再拖拽对象上的淡绿色小点就可以改变这个对象的碰撞范围
在这里插入图片描述
这样改变的碰撞线的对象有就能够在碰撞线所在的位置对其他物体进行碰撞

在这里插入图片描述
在编辑按钮下面的一系列信息就是一种参数化的改变碰撞线的方法,可以自己尝试下
在这里插入图片描述


碰撞检测

我们先写一段代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EP22_01_Physics: MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnCollisionEnter(Collision collision)//实际运行顺序在Updata上面
    {
        Debug.Log("碰撞开始");
    }
    private void OnCollisionStay(Collision collision)
    {
        Debug.Log("碰撞中");
    }
    private void OnCollisionExit(Collision collision)
    {
        Debug.Log("碰撞结束");
    }

}

需要注意的是,碰撞检测代码放在空对象中是不会起作用的,所以我们需要拖拽到实例物体中
在这里插入图片描述
这个时候我们再拿 player 对象去碰撞 item 会打印出下图信息
但是打印信息这种条件,只需要一方有刚体 rigidbody
然而如果双方在 rigidbody 中勾选上了 is kinematic ,就不会再打印,这是因为,不让该物体运动后,unity为了提升整个系统的性能就会,将不会运动的刚体给忽视掉,用来提升性能
在这里插入图片描述

相关推荐

  1. 【名词解释】Unity中的3D物理系统碰撞

    2024-04-09 11:54:04       7 阅读
  2. Cocos Creator 3D物理引擎的碰撞检测与触发器详解

    2024-04-09 11:54:04       7 阅读
  3. unity车辆碰撞检测

    2024-04-09 11:54:04       24 阅读
  4. 最新Unity DOTS Physics物理引擎碰撞事件处理

    2024-04-09 11:54:04       40 阅读
  5. DOTS Unity.Physics物理引擎碰撞事件处理

    2024-04-09 11:54:04       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 11:54:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 11:54:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 11:54:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 11:54:04       18 阅读

热门阅读

  1. 什么是物理服务器?

    2024-04-09 11:54:04       13 阅读
  2. 链表的头插,尾插,逆序 and 合并两个有序表

    2024-04-09 11:54:04       14 阅读
  3. [C语言]二分查找

    2024-04-09 11:54:04       17 阅读
  4. restic备份

    2024-04-09 11:54:04       15 阅读
  5. [23年蓝桥杯] 买二赠一

    2024-04-09 11:54:04       12 阅读
  6. git使用

    git使用

    2024-04-09 11:54:04      12 阅读
  7. git 的使用,及其基本指令。

    2024-04-09 11:54:04       12 阅读
  8. go interface{} 作为函数参数

    2024-04-09 11:54:04       12 阅读
  9. 1006 换个格式输出整数

    2024-04-09 11:54:04       13 阅读
  10. Flutter 使用flutter_swiper_null_safety 实现轮播图

    2024-04-09 11:54:04       12 阅读