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的情况下响应触发检测函数
仅提供以上两个思路,大家可以试着尝试各种组合,查看触发哪些函数。
评论
查看更多