您的位置:首页 > 移动开发 > Unity3D

Unity3D入门(二):碰撞检测

2013-10-03 02:39 423 查看

碰撞器由来

1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件。

2.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛。为了完整的了解这两种方式,我们必须理解以下概念:

(一)碰撞器是一群组件,它包含了很多种类,比如:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。

(二)所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。

(三)在Unity3d中,主要有以下接口函数来处理这两种碰撞检测:

触发信息检测:

1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器

2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器

3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

碰撞信息检测:

1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器

2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器

3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器

碰撞使用场景

1.给主角添加刚体(Rigidbody)组件,并且取消刚体组件的重力选项UseGravity。



2.主角碰到一些物体后会有一系列反应。举例,完雷电游戏时,飞机可以获取一些加速球能量球,碰到这些球体,飞机自身属性会有所提高
下图:蓝色球为“加速球”,红色球为能量球,的当飞机接触球体时,属性就会增加



主角的脚本代码如下:

using UnityEngine;
using System.Collections;

public class Hero : MonoBehaviour {

private float move_v = 0;//纵向移动距离
private float move_h = 0;//横向移动距离
public float m_speed = 1.5f;//移动速度
public float m_power = 1.0f;//飞机的威力能量
private Transform m_transform;

void Start () {
m_transform = this.transform;
}

void Update () {
Move();
}

//飞机与物体发生碰撞,需要判断碰撞体是什么类型
void OnTriggerEnter(Collider e)
{
if (e.gameObject.tag.CompareTo("tagSpeedBall")==0)
{
Debug.Log("捡到加速球");
m_speed += 5;//速度+2
Destroy(e.gameObject);//销毁加速球
}

if (e.gameObject.tag.CompareTo("tagPowerBall") == 0)
{
Debug.Log("捡到能量球");
m_power += 2;//威力+2
Destroy(e.gameObject);//销毁能量球
}
}
//移动方法
void Move()
{
//向上
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
//移动距离
m_transform.Translate(-Vector3.forward * Time.deltaTime * m_speed);

}
//向下
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{

m_transform.Translate(Vector3.forward * Time.deltaTime * m_speed);

}

//向左
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{

m_transform.Translate(Vector3.right * Time.deltaTime * m_speed);
}

//向右
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{

m_transform.Translate(Vector3.left * Time.deltaTime * m_speed);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: