Unity --- 物理引擎 --- 触发器 与 碰撞器详解

碰撞器补充讲解

对第一个条件进行补充 --- 不仅要两者都具有碰撞组件,同时还需要两者的碰撞组件中都没有勾选 Is Trigger属性

 1.上一篇文章中说了那么多,其实也可以总结为两个碰撞条件 --- a.两个游戏物体都具有碰撞器组件 ,如果没有的话,连碰撞检测都不会发生,也就没有所谓的碰不碰撞一说了

b.运动的物体具有刚体组件 --- 在有刚体组件的前提下,物体只有处于运动状态时才具有

1.第一个阶段会在两个物体接触的第一帧执行 --- 只执行一次

2.第二个阶段会在两个物体保持接触时每帧执行 --- 每帧执行

3.第三个阶段则是在两个物体分离的那一帧执行 --- 只执行一次

4.collision(名词.碰撞) --- 上面那个Collision是一个类 --- 其实就是碰撞器类

1.碰撞阶段的三个方法都有一个参数 --- Collision other --- 这个参数的类型是碰撞器类 --- 当挂载该脚本的游戏物体a与其它具有碰撞器组件的游戏物体b发生碰撞时, 游戏物体b的碰撞器组件对象就会被传给三个方法中的引用参数 Collision other.

(注意!!! 碰撞器组件对象是被传给了Collision类内部的一个引用 --- 该引用的类型是Collider,引用名就是 collider  --- 如果说想访问碰撞器组件对象的话得通过 对应类型的参数名 + 点操作符 + 类中的引用的引用名)

2.注意!只有满足了两个碰撞条件(a.都具有碰撞器组件 b.运动的物体上具有刚体组件  --- 不处于运动状态的话则刚体组件处于休眠状态)之后才能够开始执行碰撞的三个阶段对应的方法 --- 对了写有方法的脚本也得挂载到游戏物体上并启动才行

扫描二维码关注公众号,回复: 14866522 查看本文章

触发器讲解

碰撞器组件中勾选了Is Trigger属性的游戏物体无论是撞别人还是被别人撞都不会产生碰撞效果而是直接穿过去

 1.碰撞器组件中的Is trigger属性被勾选后就转变为了 --- 触发器

触发器与碰撞器的区别就是 --- 触发器不会产生碰撞效果

1.注意!只需要带有刚体组件即可,不需要处于运动状态

1.满足触发条件之后就会开始执行触发三阶段所对应的方法 

注意碰撞三阶段与触发三阶段之间的 --- a.方法区别 b.方法的参数的类型区别(一个是Collision类名词碰撞,类中有一个Collider类型的引用  ; 另一个是Collider类 名词碰撞器,它就是碰撞器类型)


Collision类 与 Collider类

1.Collision类中包含一个引用,该引用的类型是Collider,引用名是collider

2.Collider类就是碰撞器类,游戏物体挂载的碰撞器组件对象类型就是Collider

3.Collision类还包含一个很重要的引用 --- contacts

1.contact(v.接触)

2.这个引用的类型是 ContactPoint[ ] --- 也就是说这个引用是一个数组引用,它指向的是一个存放两个物体发生碰撞时的接触点的数组

3..通过这个引用 + 索引,我们能够访问到碰撞点 

4.碰撞点类型 --- ContactPoint中有两个比较重要的属性 --- point  /  normal

两者的类型都是Vector3类,不过point表示的是接触点的坐标,而normal表示的是接触面的法向量

5.一个游戏物体可以拥有多个碰撞器组件以此来实现多重碰撞检测,一般来说都是一个碰撞器用来作为触发器,一个碰撞器用来模拟物理效果的(说白了就是一个有Is Trigger ,一个没有Is Trigger)

1.如果物体移动速度过快的话,碰撞检测将失效,此时需要我们更换检测方式  --- 使用射线检测法来进行替代

2.射线检测方法被封装在了Physics类中 --- 方法名:Raycast() -- 为静态方法 --- 这个方法的一个重载方法的参数中有一个比较特别的参数  ---- 参数的类型是 out RaycastHit --- 这个参数被out 修饰,是一个输出参数,也就是说在方法调用的时候会将一些计算结果赋值给这个参数 --- 这个参数的使用方法是:

a.在调用方法前建立一个无out的参数 -- 如上图,然后将其传参给函数,函数调用过程中将一些结果赋值给这个参数,这个参数再传给外面的无out同类型的传参源头引用

b.RaycastHit类对象是用来记录射线检测到的各种数据的,如射线检测到的点的坐标,射线检测到的面的法向量等等 --- 具体可以查看该类的内部

3.该方法除了在调用过程中传参给输出(out)参数外,在方法调用结束的时候也会返回一个bool值 --- bool值为true则意味着射线检测到了物体,反之就是没有检测到物体

4.通过射线检测来进行碰撞判定,说白了就是在物体运动之前就计算和设计好了是否会碰撞,如果没碰撞发生什么,如果碰撞了又发生什么,以及物体怎么运动 --- 通过这种方式能够规避掉边运动边检测(如逐帧检测)可能带来的失效问题

猜你喜欢

转载自blog.csdn.net/qq_51947882/article/details/130048136