【Unity入门】24.碰撞检测

本文介绍了Unity中的碰撞检测机制,包括不同类型的Collider组件如BoxCollider、SphereCollider等,并展示了如何编辑和调整碰撞体大小。此外,文章还讨论了运动学刚体(IsKinematic)和触发器(isTrigger)的概念,以及如何通过OnTriggerEnter等函数在脚本中检测碰撞事件。
摘要由CSDN通过智能技术生成

【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("发生了碰撞");
    }
}

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

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lampard杰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值