【Unity入门】碰撞检测与触发检测
版权声明:本文为博主原创文章,转载请注明出处。
在Unity里面,游戏物体的碰撞我们可以通过刚体组件(Rigidbody)和碰撞器组件(Collider)来进行检测。首先在场景里面添加一个Plane面板作为地面,然后在Plane面板的上方一定高度处放一个Cube立方体。
然后给Cube立方体添加一个刚体组件(Rigidbody)。运行游戏,这时候我们可以看到立方体掉在了面板上面。
立方体和面板产生了碰撞,并且静止在面板上,这时候我们可以可以通过脚本来进行检测,比如立方体掉在面板上的时候我们可以将其销毁。给立方体添加一个检测碰撞的脚本组件CubeCollision,语言使用C#。代码如下:
- /**
- * Copyright (c) Clarence Zeng Binsi
- *
- * Author: ZengBinsi
- * Date: 2016/01/25 16:10:28
- * Desc: Collision test
- */
- using UnityEngine;
- using System.Collections;
- public class CubeCollision : MonoBehaviour {
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- // 碰撞开始
- void OnCollisionEnter(Collision collision) {
- // 销毁当前游戏物体
- Destroy(this.gameObject);
- }
- // 碰撞结束
- void OnCollisionExit(Collision collision) {
- }
- // 碰撞持续中
- void OnCollisionStay(Collision collision) {
- }
- }
在MonoBehaviour类中,OnCollisionEnter、OnCollisionExit和OnCollisionStay是碰撞时的回调方法,我们可以在CubeCollision类中重载它们。当绑定了CubeCollision脚本组件的游戏物体发生碰撞时,OnCollisionEnter便会被触发调用一次。然后,在整个碰撞过程中会持续调用OnCollisionStay方法,直到碰撞接触被解除时,OnCollisionExit被触发一次。这是一个完整的碰撞接触过程,这三个方法都有一个Collision类型的参数,用于保存碰撞信息。
如果我们想要在当前脚本中去操作被立方体碰撞到的对象(面板),那么我们可以通过这三个方法的参数collision来获得被碰撞的游戏物体的碰撞器组件对象(collider)。然后通过collider对象可以得到碰撞器组件挂载的游戏物体的信息。
- // 碰撞开始
- void OnCollisionEnter(Collision collision) {
- var name = collision.collider.name;
- Debug.Log("Name is " + name);
- }
这样子就可以得到被碰撞的游戏物体的名称。
如果我们有很多游戏物体,名称各不相同,如果要检测某一类型的,我们可以通过给游戏对象设置Tag值来进行区分。我们给面板对象设置一个Tag值:
然后修改代码为获取Tag值:
- // 碰撞开始
- void OnCollisionEnter(Collision collision) {
- var tag = collision.collider.tag;
- Debug.Log("Tag is " + tag);
- }
重新运行游戏:
除了碰撞之外,Unity还支持接触检测。因为使用碰撞检测,发生碰撞的游戏物体之间会有碰撞模拟,比如撞到东西会反弹或者停顿一下之类的。有时候我们只是想要检测物体与物体之间是否发生接触,但是不要产生碰撞的效果,这时候我们可以使用触发器来进行接触检测。
首先,我们把立方体Cube的碰撞器设置为触发类型:
像这样,我们在Cube的检查视图中找到碰撞器组件,将该组件的IsTrigger属性勾选上,这样在游戏物体发生接触的时候就不会有碰撞的效果了,而是会直接穿过去。Unity的碰撞器有很多类型,Cube的碰撞器类型是盒子碰撞器(BoxCollider),另外还有球形碰撞器、胶囊体碰撞器等。
然后,我们在CubeCollision脚本组件里面重载以下三个方法:
- // 开始接触
- void OnTriggerEnter(Collider collider) {
- Debug.Log("开始接触");
- }
- // 接触结束
- void OnTriggerExit(Collider collider) {
- Debug.Log("接触结束");
- }
- // 接触持续中
- void OnTriggerStay(Collider collider) {
- Debug.Log("接触持续中");
- }
MonoBehaviour类的OnTriggerEnter、OnTriggerExit和OnTriggerStay是触发检测的三个回调方法,OnTriggerEnter在游戏物体发生接触时调用一次,OnTriggerExit在游戏物体完全分离时调用一次,而OnTriggerStay在游戏物体接触过程中持续调用。
【值得注意的是,触发器回调的这三个方法的参数都是Collider类型,表示的就是被碰撞的游戏物体的触发器组件对象。】
重新运行游戏,我们可以在控制台看到调试信息:
这时候Cube会直接从Plane中穿下去,不会停在面板上。
【Unity入门】碰撞检测与触发检测的更多相关文章
- Unity入门一,什么是GameObject,MonoBehaviour
Unity入门一,什么是GameObject,MonoBehaviour GameObject和Component Unity是一个Component-Based的引擎,所有物体都是GameObjec ...
- Unity入门教程(下)
一.概要 在 Unity入门教程(上) 中我们创建了一个游戏项目,并且创建了玩家角色和小球这些游戏对象,还通过添加游戏脚本实现了小方块的弹跳.虽然功能比较简单,但是完整地表现了使用Unity开发游戏的 ...
- unity射线碰撞检测+LayerMask的使用
射线在unity中是个很方便的东西,对对象查找.多用于碰撞检测(如:子弹飞行是否击中目标).角色移动等提供了很大的帮助,在此做个总结与大家分享下 ,若有不足欢迎吐槽 好了,话补多说啦,直接进入主题: ...
- FPGA基础入门篇(四) 边沿检测电路
FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...
- Unity入门
Unity入门 用unity做一个最简单的交互.(相当于Hello World)仅仅要最后能执行就算入门了. 第一步,要先用三维制作软件制作出我们须要的场景. 这儿使用的是Max2012(软件大小3. ...
- unity入门—五分钟制作一个理论上的游戏
unity入门 前言:这可不是标题党,虽然都是基础的操作,不过含括了基本的流程,比起脑海中的五花八门的画面,入门还是这个现实一点. 这里插两句,unity国外官网下载会推荐你看一个简短的视频,国内官网 ...
- Unity入门&物理引擎
一.Unity六大模块 首先,Unity界面有六大模块,分别是:Hierarchy,Scene,Game,Inspector,Project,Console.下面对这六个视图的功能进行详解. 1.Hi ...
- Unity Layout碰撞检测
第一次看到LayerMask根本不知道是什么东东,后来问问度娘,看了几篇文章,终于看明白一点点,在网上看到各路大神的解释,终于明白了,LayerMask实际上是一个位码操作,在Unity3d中Laye ...
- 【Unity】EasyTouch5触屏检测
Unity AssetStore地址 https://assetstore.unity.com/packages/tools/input-management/easy-touch-5-touc ...
随机推荐
- 如何使用 EXCEL 的筛选功能
假设有一个Excel文档,有两列“姓名”和“成绩”. 现需筛选出成绩 “大于等于90”或者“小于60”的学生. 步骤如下: 1.选中任意一个单元格,点击工具栏上的 数据 - 筛选 - 自动筛选 ,可以 ...
- 在windows系统上安装VMware Workstation虚拟机,然后在虚拟机VMware Workstation上安装linux系统,在linux系统安装xshell的服务端,在windows系统上安装xshell。用windows系统上的xshell连接到linux
第一步:安装xshell: 去百度 xshell ,然后安装一下就可以了.就是普通的软件安装,在这里不做过多的接收. 第二步:安装虚拟机VMware Workstation 百度安装,不做过介绍 ...
- Zookeeper工作原理
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...
- iOS 开发 中级:UIToolbar,UINavigationBar,UITabBar,UIBarButtonItem,UITabBarItem自定义方法总结
原文: http://blog.csdn.net/songrotek/article/details/8692866?utm_source=tuicool 对于UIToolbar,UINavigat ...
- HDU 3342 Legal or Not (图是否有环)
题意: 给出n个人的师徒关系,如有 a是b的师傅,b是c的师傅,c是a的师傅,这样则不合法,输出NO,否则输出YES. 思路: 每段关系可以看成一条有向边,从师傅指向徒弟,那么徒弟的徒子徒孙都不可能再 ...
- *ecsho 的商品详细页面上获取该商品的一级分类ID及NAME
1.打开goods.php并找到 $smarty->assign('goods', $goods); 在它上面增加以下代码 $cat_arr = get_parent_cats($goods[' ...
- UVa120 - Stacks of Flapjacks
Time limit: 3.000 seconds限时:3.000秒 Background背景 Stacks and Queues are often considered the bread and ...
- [转载] FFmpeg 错误 C4996: ‘avcodec_alloc_frame’: 被声明为已否决 解决方法
在 Visual Studio 2013 下编写 FFmpeg 程序时出错,错误如下: 出错代码如下: 解决方法为:将 avcodec_alloc_frame() 替换为 av_frame_alloc ...
- new tips
老外的一篇文章(原文地址http://stackoverflow.com/questions/6647677/tips-for-efficient-as3-coding),有这么一段描述: Use [ ...
- Java中传值与传引用
不管Java参数类型是什么,一律传递参数的副本. <Thinking In Java>:“When you're passing primitives into a method,you ...