在上一节我们介绍了刚体,但刚体只能使物体可以在力的作用下运动,小球之所以能撞到地面而不是穿过地面,是因为在创建物体时,U3D自动为每个物体附加了碰撞器,有了碰撞器,才会使物体正常的碰撞,而不是穿过。
接着上节的项目,选中Shere,点掉物体的材质渲染Mesh Renderer选项,在Scene视图里的绿线就是碰撞器
在碰撞器的属性中我们可以看到,U3D允许我们手动调节碰撞器的位置和大小(这里告诉大家一个小技巧,鼠标放在X,Y,Z,Radius,当鼠标变成两个左右对立的小箭头时,上下移动鼠标可以调节编辑框里的数值)
对于简单的几何物体,碰撞器相对简单,而当物体的模型是一个个鲜活的人物,球形碰撞器或者方盒碰撞器显然无法正常模拟物体的碰撞范围,这时就需要用到网状碰撞器。选中小球,在菜单栏选择Component——>Physics——>Mesh Collider在弹出是否替换碰撞器的对话框中选择替换,这样我们就为物体添加了网格碰撞器,在Scene视图,我们可以看到,网格碰撞器是按照物体的形状精密的排布,这样,不论物体是什么形状,我们都可以为它添加碰撞器了,但值得注意的是:两个网格碰撞器是不发生碰撞的
触发器:
在游戏中我们常常遇到这样的场景,走近一片特定区域,人物就会被传送或者遇到怪物,这就是我接下来要介绍的触发器(概念太过学术,不喜欢,就不说了),在上图中选中Is Trigger,碰撞器便成了触发器,需要注意的是,触发器是可以被穿越的,不然我们怎么进入这边区域呢,对吧
和碰撞器一样,触发器也有相应的行为函数:
OnTriggerEnter:当物体进入触发器的一瞬间触发
OnTriggerStay:当物体进入触发器后离开触发器前触发
OnTriggerExit:当物体离开触发器的一瞬间触发
为了让大家理解触发器,我们接着上节的项目,做一个小测试
选中Cube,将它作为触发器,将下面的脚本拖到Cube上
- using UnityEngine;
- using System.Collections;
- public class TriggerTest : MonoBehaviour {
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- void OnTriggerEnter(Collider other)
- {
- print(other.gameObject.name + "Enter");
- }
- void OnTriggerStay(Collider other)
- {
- print(other.gameObject.name + "Stay");
- }
- void OnTriggerExit(Collider other)
- {
- print(other.gameObject.name + "Exit");
- }
- }
using UnityEngine;
using System.Collections;
public class TriggerTest : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter(Collider other)
{
print(other.gameObject.name + "Enter");
}
void OnTriggerStay(Collider other)
{
print(other.gameObject.name + "Stay");
}
void OnTriggerExit(Collider other)
{
print(other.gameObject.name + "Exit");
}
}
运行结果: