unity碰撞检测的穿透是什么 unity 碰撞检测_碰撞体检测

 

(一)碰撞体

(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,因此篮球和草地之间就可以检测到碰撞

unity碰撞检测的穿透是什么 unity 碰撞检测_游戏引擎_02

(2)编辑碰撞体

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

unity碰撞检测的穿透是什么 unity 碰撞检测_unity_03

同样会生成一个包裹住篮球的碰撞体结构(绿框),只不过它的样子是矩形罢了

unity碰撞检测的穿透是什么 unity 碰撞检测_ide_04

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

unity碰撞检测的穿透是什么 unity 碰撞检测_unity碰撞检测的穿透是什么_05

如何调整这个组件大小呢? 

Edit Collider选项点击之后我们就可以在场景编译器中调整碰撞体组件的大小了

unity碰撞检测的穿透是什么 unity 碰撞检测_游戏引擎_06

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

unity碰撞检测的穿透是什么 unity 碰撞检测_unity_07

 

(二)碰撞体检测

(1)Kinematic运动学刚体

运动学刚体是什么呢?


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

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

unity碰撞检测的穿透是什么 unity 碰撞检测_unity_08

(2)isTrigger触发器

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


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


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

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

unity碰撞检测的穿透是什么 unity 碰撞检测_unity_09

    做完这两部后,我们就可以通过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("发生了碰撞");
    }
}

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

unity碰撞检测的穿透是什么 unity 碰撞检测_ide_10