Unity3D入门(二):碰撞检測

碰撞器由来


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);
}

}

}

Unity3D入门(二):碰撞检測

时间: 2024-08-07 17:00:22

Unity3D入门(二):碰撞检測的相关文章

Cocos2d-x 精灵碰撞检測(方法二)

将"Cocos2d-x 精灵碰撞检測(方法一)" update函数改动一下. 使用精灵boundingBox函数获取直接精灵边界框, 不用自己计算精灵矩形大小了,还比較精确,然后调用intersectsRect计算2个精灵矩形是否存在交集. 代码: void HelloWorld::update(float delta) { //返回精灵边界框 CCRect cr1 = sp1->boundingBox(); CCRect cr2 = sp2->boundingBox();

cocos2d-x 旅程開始--(实现瓦片地图中的碰撞检測)

转眼隔了一天了,昨天搞了整整一下午加一晚上,楞是没搞定小坦克跟砖头的碰撞检測,带着个问题睡觉甚是难受啊!还好今天弄成功了.只是感觉程序不怎么稳定啊.并且发现自己写的东西让我重写一遍的话我肯定写不出来.还要继续学习啊! 上次的进度: 实现了坦克的移动,昨天把程序优化了一下,能整合在一起的就整合在一个函数里了.并且对碰到屏幕边缘的情况进行了检測.之前的代码都是部分代码,今天试试把代码整个贴上去. 这两天的进度: 打这么多汉字,自个都看不进去.直接上代码: /////////////////////实

iOS 碰撞检測以及事件响应

*/ //碰撞检測 //碰撞检測de过程 //碰撞检測 //碰撞检測 //碰撞检測 //UIApplication-> UIWindow-> UIController-> 视图控制器view-> 父视图 ->子视图 //事件响应 //事件响应de过程 //事件响应 //事件响应 //事件响应 //反方向处理;UIApplication <- UIWindow <- UIController <- 视图控制器view <- 父视图 <- 子视图;

Cocos2d-x碰撞检測

假设不适用Box2D物理引擎.那么要进行Cocos2d-x的碰撞检測那我们的方法往往就是进行"矩形和点"."矩形和矩形"这样粗略的碰撞检測.我们一般採取开启scheduleUpdate定时器.然后重写update函数进行每一帧都进行碰撞检測. <1>碰撞检測的代码较为繁琐.恕我无法为你具体列出其思路能够是在update中遍历全部的sprite, 然后推断每一个sprite和其它sprite(还需遍历一遍.刨除自己)是否碰撞. 这样等于推断次数是sprit

Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測

事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖(小若:32个喷! ),怎么都到第七篇了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/920 文章来源:笨木头与游戏开发 碰撞监听 首先,确保我们创建物理对象的时候,给对象设置了碰撞条件(假设你是一步步按着教程来写的代码,那就是设置好了): body->setCategoryBitmask(1);  

实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact(b2Contact* contact).两个物体開始接触时会响应,但仅仅调用一次. virtual void EndContact(b2Contact* contact).分离时响应. 但仅仅调用一次. virtual void PreSolve(b2Contact* contact, const

cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測

玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸,当子弹与僵尸碰撞的时候子弹自己主动消失,这就这节要说的碰撞检測. 以下详细看代码的实现: 做ios开发有触摸事件cocos2d相同也有 一.先覆写touch事件 .h文件 using namespace cocos2d; class MainScene:public CCLayer { privat

Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题

好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感觉确实要简单不少,只是在这当中还是遇到了些问题,首先就来说说onContactBegin这个回调函数响应问题. 先说说情况.简单做了一个打砖块的游戏.前面一切都非常顺利,仅仅是做到碰撞检測的时候,发现回调函数弄死都不调用.開始我以为函数写错了,后来查了api.testCpp都没有错,在3.0的api

cocos2d-html5 碰撞检測的几种方法

游戏中的碰撞还是比較多的,比方角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都须要 进行碰撞的检測,来触发一定的事件 近期在尝试制作一个小游戏的时候须要用到碰撞检測,然后就查了下资料,并在论坛进行提问等算是找到了比較惬意的碰撞检測方法,这里记录下来 如今自己知道的方法算是有了三种了,以下一一记录并分析下他们各自的优缺点 1.就是官方提供的,依据getBoundingBox();方法获取要检測的碰撞物体的范围,然后再依据rectIntersectsRect();方法进行推断须要检測的两个