当前位置: 首页 > article >正文

【Unity入门】24.碰撞检测

【Unity入门】碰撞检测

    大家好,我是Lampard~~

    欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 

 

(一)碰撞体

(1)Collider组件

    上节课我们有学习到,unity的物理系统提供了更方便的碰撞检测机制,就是提供各种的Collider组件去检测碰撞需求

Unity 中有以下几种 Collider 组件:

1. Box Collider(盒子碰撞器):一个基于矩形的碰撞体,用于模拟长方体或立方体物体的碰撞。

2. Sphere Collider(球形碰撞器):一个基于球形的碰撞体,用于模拟球体物体的碰撞。

3. Capsule Collider(胶囊碰撞器):一个基于胶囊形状的碰撞体,用于模拟某些具有胶囊形状的物体的碰撞,比如人物角色。

4. Mesh Collider(网格碰撞器):一个基于游戏对象模型的碰撞体,用于模拟复杂的几何形状的物体的碰撞,比如地形、建筑等。

5. Terrain Collider(地形碰撞器):一个基于 Unity 地形的碰撞体,用于模拟地形的碰撞。

6. Wheel Collider(车轮碰撞器):一个专门针对车辆的碰撞体,用于模拟车辆的轮子与地面的碰撞。

7. Character Controller(角色控制器):一个专门为人物角色设计的碰撞体,用于模拟人物角色的移动和碰撞。

    我们就给篮球加上了球形的 Sphere Collider给草地加上了盒子立方体形的Box Collider,因此篮球和草地之间就可以检测到碰撞

(2)编辑碰撞体

    此时若我突发奇想,如果我想给篮球加一个矩形的碰撞体,不用球形的行不行呢?

    试试看就知道了, 我们发现,选用矩形的碰撞体组件同样会生成一个包裹住篮球的碰撞体结构(绿框),只不过它的样子是矩形罢了

    运行起来也是没有问题的,所以用哪一个碰撞体组件真的就没那么严格限制:

    在创建的时候,unity的物理引擎会自动计算出物体的大小,从而生成合适的碰撞体组件。那比如我们需要篮球在空中还有一定距离时就停下(监听到碰撞),如何调整这个组件大小呢? 

    很简单,选中collider组件,里面有一个Edit Collider选项点击之后我们就可以在场景编译器中调整碰撞体组件的大小了

    比如把组件调的那么大,就可以在绿框和草地接触的那一刻停下 

 

(二)碰撞体检测

(1)Kinematic运动学刚体

    刚体我们知道是物理学中研究的一个物体对象概念,那运动学刚体是什么呢

运动学刚体不受物理引擎的计算和影响,而是由开发者手动控制它的运动。运动学刚体可以设置为运动、旋转或缩放,但不会受到重力、碰撞等物理效果的影响。运动学刚体通常用于模拟精确的动画或特效效果,或者用于实现一些特定的游戏机制

    选中Rigidbody组件,里面有一个可以选择Is Kinematic的参数,选中就可以让它成为一个运动学刚体

(2)isTrigger触发器

    第二步需要设置碰撞体为触发器

isTrigger 是 Collider(碰撞体)组件中的一个属性,用于指定碰撞体是否为触发器。

当一个碰撞体的 isTrigger 属性被设置为 true 时,该碰撞体就不会影响游戏对象的物理运动,也不会产生碰撞效果,而只是用于检测游戏对象是否进入了该碰撞体的范围内。当游戏对象进入触发器时,就会触发 OnTriggerXXX 系列函数(比如 OnTriggerEnter、OnTriggerStay、OnTriggerExit)

    只需要选中Collider组件,勾线IsTrigger参数就可以了

    做完这两部后,我们就可以通过OnTriggerXXX 系列函数在脚本中检测碰撞的发生

    我们可以给篮球加一个脚本试试看效果:

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

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

    }

    // Update is called once per frame
    void Update()
    {
        float DisPreSec = 6f;
        this.transform.Translate(0, -DisPreSec * Time.deltaTime, 0);
    }

    void OnTriggerEnter()
    {
        Debug.Log("发生了碰撞");
    }
}

    看看输出,在碰撞的一霎那确实就打印出来了:

 

好啦今天就到这里,谢谢各位感谢阅读!!!
点赞,关注!!!


http://www.kler.cn/news/16811.html

相关文章:

  • 滴水逆向三期笔记与作业——02C语言——02数据类型
  • JDBC详解(四):操作BLOB类型字段(超详解)
  • Python做个猫狗识别系统,给人美心善的邻居
  • matlab for循环详解
  • 其他自定义代码片段
  • 设计模式--装饰者模式
  • JSP+Struct+MySql基于BBS管理系统设计与实现(源代码+论文+中英资料+开题报告+答辩PPT)
  • Java 怎样实现代理模式,有什么优缺点
  • ospf扩展配置—认证、沉默接口、加快收敛、缺省路由
  • 2023-04-23 学习记录--C/C++-邂逅C/C++(中)
  • hive 清空分区表 多姿势对比
  • 微服务知识2
  • C语言文件操作【基础知识 + 顺序读写 + 文件版通讯录】
  • 【Java笔试强训 17】
  • maven install的时候报Unable to find main class
  • 财报解读:照明行业景气上行,欧普照明已步入增长“快车道”
  • Noah-MP陆面过程模型建模方法与站点、区域模拟实践技术
  • linux命令之tar详解
  • 快速了解车联网V2X通信
  • 接踵而至,昆仑万维天工大语言模型发布
  • Linux必会100个命令(六十)curl
  • 小满nestjs(第二十八章 nestjs 事务)
  • 1.软件测试
  • 常见元件、封装、尺寸、表面处理等
  • C语言中的三种语句
  • fastai2 实现SSD
  • 1699_simulink代码生成配置初级方案
  • 【Java】内部类Object类
  • SpringBoot整合Redis实现点赞、收藏功能
  • @TransactionalEventListener的使用和实现原理