unity3d中的碰撞器和触发器的区别

编程实验

72人已加入

描述

Unity3D中的碰撞器

如果游戏对象需要感应碰撞,那么必须给其添加碰撞器。默认情况下,创建游戏对象时,会自动将碰撞器组件添加至其中,而碰撞器组件决定了模型碰撞的方式。Unity一共为对象提供了5中碰撞器,分别是:

Box Collider :盒子膨胀器。

Sphere Collider: 球体碰撞器。

Capsult Collider:胶囊碰撞器。

Mesh Collider:网格碰撞器。

Wheel Collider:车轮碰撞器

其中,Box Collider适用于立方体对象之间的碰撞,Sphere Collider适用于球体之间的碰撞,Capsule Collider适用于胶囊体对象之间的碰撞,Mesh Collider比较特殊,它的碰撞方式由自定义模型的自身网格决定,适用于自定义网格的碰撞,Wheel Collider 适用于车轮与地面或其他对象之间的碰撞。

在碰撞器之间可以添加物理材质,用于设定物理碰撞后的效果。物理材质与碰撞器之间的关系非常紧密,比如两个立方体相撞之后。按照物理引擎的效果,它们将开始相互反弹,那么反弹的力度就是物理材质决定的。

添加碰撞器的方法:

在Unity菜单栏中选择“Compoent”-》“Physics”菜单项,然后从中选择碰撞器的种类。

标准材质库:

(Bouncy)弹性材质

(Ice)冰材质

(Metal)金属材质

(Rubber)橡胶材质

(Wood)木头材质

物理材质相关属性的意思

Dynamic Friction:动态摩擦,取值在0到1之间。0表示最小动态摩擦,1表示最大动态摩擦。

Static Friction:静态摩擦,取值在0到1之间。0表示最小静态摩擦,1表示最大静态摩擦。

Bounciness:碰撞反弹系数,取值在0到1之间。0表示碰撞无反弹,1表示碰撞最大反弹。

Friction Combine:普通碰撞后的摩擦模式。

Bounce Combine:反弹碰撞后的摩擦模式。

Friction Direction 2:摩擦方向,方向分为x轴、y轴和z轴。

Dynamic Friction 2:动摩擦系数,它的摩擦方向根据Friction Direction 2 设定。

Static Friction 2: 静摩擦系数,它的摩擦方向根据Friction Direction 2 设定。

Unity引擎触发器

碰撞触发器意思就是检测到两个物体碰撞的时候,触发执行脚本相关的逻辑。比如在游戏中实现两个物体相撞的时候产生爆炸的效果,那么就需要通过触发器来检测到两个物体相撞的时候,然后播放预设好的爆炸的粒子效果。

Unity引擎触发器系统有三个属性:Box Collider、Is Trigger、Rigibody

Box Collider:Unity3D的GameObject提供的基本模型才具有这个属性,表示该物体是否会和别的物体发生碰撞。

Is Trigger:BoxCollider的子选项,表示该物件是否为一个触发器。

Rigibody:选中物件,才能在菜单“Component”里,给物件添加Rigibody组件。

两Collider相碰,至少要有一个物体具有Rigibody刚体才会触发Trigger函数。当物体进来,OnTriggerEnter当然会触发。出去时,OnTriggerExit也当然触发。那么物体在进来后Destory后会如何?经过测试是:不会调用OnTriggerExit。

基本规则:脚本(含有触发判断的 OnTriggerEnter() 判断函数)和Rigibody同为一个物件的组件,Box Collider必须选中。此时两个物件的Box Collider必须为选中。而 Is Trigger选项必须“至少”有一个物件为选中(可以按逻辑来判断哪个为触发器)。 脚本中的OnTriggerEnter()可以有两种判断出发方式,此函数参数的数据类型为 Collider。 OnTriggerEnter( gameObj : Collider ),一旦触发器和Collider发生碰撞,便会触发此函数,其参数便是不包含脚本的物件的gameObject。可以通过判断其成员 name(物体在Hierarchy面板中的名字) 或 tag(物件在Inspector面板的Tag选项中的名字) 的字符串,来判定是哪个物件。

关于Unity里面的触发器的应用不仅仅可以解决物体之间的碰撞问题,常常还会用来实现游戏边界的检测辅助实现一些游戏逻辑。

1、使用Empty GameObject来实现地面或者顶部边缘的检测,比如在实现游戏主角从上面掉下来就会死掉,那么就可以在底部做一个Empty GameObject来通过触发器检测游戏主角是否掉下来。

2、游戏背景或者物体的动态生成,比如要实现一个打飞机游戏,敌人和背景都是从上往下移动,在游戏的实现逻辑里面,当上面的敌人和背景向下移动到底部的时候,你需要再生成一批敌人和背景从上面继续移动,而当这一批敌人和背景离开屏幕的时候,你还需要销毁掉它们。实现这样的一个逻辑也可以依靠触发器来辅助实现。原理如下图所示: 

      触发器

触发器的示例代码:

using UnityEngine;

using System.Collections;

// 边缘触发器,当移动的物体碰撞到之后将产生新的

public class LevelEdge : MonoBehaviour

{

// 碰到边缘 重新生成背景的物体 这里才是判断是否生成新的游戏物体的前提

void OnTriggerEnter(Collider other)

{

// 碰撞到新增触发器,将新增一套新的物体

if (other.name == “SpawnTriggerer”)

{

switch (other.tag)

{

case “SecondLayer”:

LevelGenerator.Instance.GenerateSecondLayer(0);

break;

case “ThirdLayer”:

LevelGenerator.Instance.GenerateThirdLayer(0);

break;

case “FourthLayer”:

LevelGenerator.Instance.GenerateFourthLayer(0);

break;

case “Obstacles”:

LevelGenerator.Instance.GenerateObstacles();

break;

}

}

// 碰撞到重设触发器,将销毁当前的物体

else if (other.name == “ResetTriggerer”)

{

switch (other.tag)

{

case “SecondLayer”:

case “ThirdLayer”:

case “FourthLayer”:

LevelGenerator.Instance.SleepGameObject(other.transform.parent.gameObject);

break;

case “Obstacles”:

other.transform.parent.GetComponent《Obstacles》().DeactivateChild();

LevelGenerator.Instance.SleepGameObject(other.transform.parent.gameObject);

break;

}

}

// 碰撞到武器

else if (other.tag == “PowerUps”)

{

other.GetComponent《PowerUp》().ResetThis();

}

//If a torpedo is collided with this

// 碰撞到炮弹

else if (other.name == “Torpedo”)

{

other.transform.parent.gameObject.GetComponent《Torpedo》().ResetThis();

}

}

}

unity3d 碰撞器和触发器的区别

碰撞器:Box Collider 盒碰撞器、Capsule Collider 胶囊碰撞器、Mesh Collider 网格碰撞器、Sphere Collider 球碰撞器 等等这一类组件。

触发器:以上这些碰撞器在检视面板中勾选IsTrigger属性就变成了触发器

区别:

(1)碰撞器有碰撞效果

(2)IsTrigger=false

(3)碰撞信息检测

MonoBehaviour.OnCollisionEnter(Collision collision)

MonoBehaviour.OnCollisionExit(Collision collision)

MonoBehaviour.OnCollisionStay(Collision collision)

(1)触发器没有碰撞效果

(2)IsTrigger=true;

(3)触发信息检测:

MonoBehaviour.OnTriggerEnter(Collider collider)

MonoBehaviour.OnTriggerExit(Collider collider)

MonoBehaviour.OnTriggerStay(Collider collider)

要明白什么时候才会产生碰撞?或者说怎样才能触发以上那些函数?

刚体(Rigidbody)

刚体使物体能在物理控制下运动。刚体可通过接受力与扭矩,使物体像现实方式一样运动。任何物体想要受重力影响,受脚本施加的力的作用,或通过NVIDIA PhysX物理引擎来与其他物体交互,都必须包含一个刚体组件。

碰撞器(那些Collider,例如BoxCollider)和刚体(Rigidbody)要一起使用才会产生碰撞,才会触发以上那些函数,只是不同的组合方式触发的函数不同,例如是否勾选IsTrigger。

一些专业术语需要了解

1、Static Collider 静态碰撞器

指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或者很轻微的移动。对于环境模型十分好用,当和刚体碰撞时而不会移动。

2、Rigidbody Collider 刚体碰撞器

指的是同时附加了刚体和碰撞器的游戏对象。通过脚本的力量和碰撞完全受物理引擎的影响。可以和只包含碰撞器的游戏对象碰撞。将会成为你游戏中使用物理效果的基本类型碰撞器。

3、Kinematic Rigidbody Collider 运动学刚体碰撞器

指的是同时包含碰撞器和刚体,并且激活IsKinematic的一类游戏对象,要移动这类游戏对象,要修改它的Transform组件,而不是用力。它们很像静态碰撞器不过对于想要不停地到处移动的碰撞器很好用。

如果有刚体有时候变得静止不动了,那么它们就是进入休眠了。意味着它们将不受物理变化影响,也就不会移动。如果你把一个运动学刚体从一个休眠的普通刚体下边移走,那休眠的刚体就会被唤醒并重新被物理变化时时影响。

举例:两个方块,Cube1和Cube2 ,移动一个方块去碰撞另外一个方块。

(1)如果这两个方块都只挂着碰撞器(例如BoxCollider)没有挂刚体(Rigidbody),不会触发消息

(2)两个方块都挂着碰撞器(例如BoxCollider)和 刚体(Rigidbody),IsTrigger=false的情况下响应碰撞检测函数,IsTrigger=true的情况下响应触发检测函数

仅提供以上两个思路,大家可以试着尝试各种组合,查看触发哪些函数。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分