这一讲,我会教大家如何写碰撞检测的代码,然后还会教大家如何使用我介绍给大家的第一个Unity的插件。
那么,废话不多说,我先介绍插件如何下载和安装。

VS For Unity 下载链接

进入这个页面,按编译器版本进行下载,我用的是2010,所以要下载这个。

安装就不用我教了,下面开始看我是如何导入Unity VS的。

点击Import之后我们会发现并没有发生什么,但是接下来我们按一下刷新的快捷键:Ctrl+F(F:Flush)就会看到上面多出来一个东西。
点击Open以后就会自动打开VS了。

OK,插件安装完毕,接下来教大家如何做碰撞检测。

发生碰撞需要两个条件,碰撞体要一个具有刚体,一个具有碰撞器。

上一讲我们已经为Cube添加了碰撞器,并且选择了Is Trigger的触发器,那么我们现在开始编写碰撞检测的代码。

在Scripts文件夹下新建一个名为PlayerCollision的C#脚本。

在写代码之前,我要介绍一下碰撞检测有好多种:
OnTriggerEnter( Collider other )当进入触发器
OnTriggerExit( Collider other )当退出触发器
OnTriggerStay( Collider other )当逗留触发器
OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
OnCollisionStay( Collision collisionInfo ) 当逗留碰撞器

以上这六个方法都是MonoBehaviour里面的,因为我们的脚本都是继承的MonoBehaviour这个类。所以我们的脚本里面可以覆盖这六个方法。

因为我们勾选了Is Trigger,所以,我们覆盖OnTriggerEnter( Collider other )方法:

//当进入碰撞器的方法public void OnTriggerEnter(Collider other){//如果碰撞的GameObject不是Floorif(!other.gameObject.name.Equals("Floor")){print("报告主人:触发器成功触发!");}}

然后,将这段代码托给Player,运行游戏。

如图所示,碰撞的确发生了,但是Player却穿过了Cube。
这并不是一个好现象!!!
那么,我们换另一个方法,将碰撞器的Is Trigger取消。
然后再将代码改为:

 public void OnCollisionEnter(Collision other){//如果碰撞的GameObject不是Floorif (!other.gameObject.name.Equals("Floor")){print("报告主人:触发器成功触发!");}}

那么,这时候可能有人会问我,刚开始我导入的插件又有什么用呢?

现在我给大家介绍一下,我最喜换这个插件其中的一个最喜欢的功能!

在VS里编辑代码的时候,我们按下快捷键Ctrl+Shift+Q会弹出一个框框。

这里包括了我们继承了MonoBehaviour里面的所有的类。

我们在里面输入On为示范,他会自动为我们索引出一切有关On的方法:

是不是很好用呢?

那么现在我们碰撞检测可以实现了,我们应该怎么实现落在Cube上的时候使Cube停止运动呢

随便问一个不懂编程的人都会说,让他不能动不就动不了了。

对啊,我们将Cube运动的代码取消不就不能运动了,那么我们该如何在游戏运行的时候取消Cube运动的代码呢?

我们将LeftCube移动到Floor前面。只要在发生碰撞的时候我们这么写:

public void OnCollisionEnter(Collision other){//定义一个字符串string CollisionName;//如果碰撞的GameObject不是Floorif (!other.gameObject.name.Equals("Floor")){//将碰撞体的名字存在字符串中CollisionName = other.gameObject.name;//如果碰撞体的名字是LeftCubeif(CollisionName.Equals("LeftCube")){//获取LeftCube身上的LeftCubeMove脚本,并切取消此代码的执行。other.gameObject.GetComponent<LeftCubeMove>().enabled = false;}}}

这时我们再运行游戏,并使Player与LeftCube发生碰撞.:

可以看到,在碰撞的一瞬间,Cube不移动了,并且右边LeftCubeMove的脚本被取消了。

这样我们是否就可以做到落在Cube上就停止他的运动了呢?

并不然!

我们总不能每发生碰撞都判断一下碰撞体的名称然后再进行取消脚本吧。

还记得在第二讲我曾经说过:(总不会写两个吧?向左一个单独的代码,向右一个单独的代码?)

现在,我来解决这个问题。

马上新建一个命为CubeMove的C#脚本。代码如下:

public class CubeMove : MonoBehaviour {//定义Cube的初始速度public float Speed = 1f;void Start () {}void Update () {//如果脚本所在模型的名字为LeftCube(Clone)或LeftCubeif (this.gameObject.name.Equals("LeftCube(Clone)") || this.gameObject.name.Equals("LeftCube")){//执行移动方法MoveLeft();}if (this.gameObject.name.Equals("RightCube(Clone)") || this.gameObject.name.Equals("RightCube")){MoveRight();}if (this.gameObject.name.Equals("StaticCube(Clone)") || this.gameObject.name.Equals("StaticCube")){MoveStop();}}//定义移动方法void MoveLeft(){//使Cube的移动速度递增Speed += 0.1f;//移动this.transform.Translate(Vector3.left * Speed * Time.deltaTime);}void MoveRight(){Speed += 0.1f;this.transform.Translate(Vector3.right * Speed * Time.deltaTime);}void MoveStop(){this.transform.Translate(0,0,0);}
}

这样,我们所有可经过的Cube就都可以公用一个脚本了。

我们将所有Cube单独控制移动的代码都取消掉,然后将CubeMove的脚本托给所有Cube,别忘了StaticCube也要给。

然后我们修改一下PlayerCollision脚本的代码:

    //当进入碰撞器的方法public void OnCollisionEnter(Collision other){//如果碰撞的GameObject不是Floorif (!other.gameObject.name.Equals("Floor")){//取消碰撞体上的CubeMove方法other.gameObject.GetComponent<CubeMove>().enabled = false;}}

这样,我们就可以简化代码,并且便于管理,而且任何人都能看懂你的代码!

谢谢的大家的关注,那么这一讲就到此结束,下一讲我会讲解如何使Player落在Cube上时出现下一个Cube

Unity3D新手教学,让你十二小时,从入门到掌握!(一 )

Unity3D新手教学,让你十二小时,从入门到掌握!(二 )

联系方式:
 查看Aries的个人资料
QQ:531193915
E-Mail:15210411296@163.com

Unity3D新手教学,让你十二小时,从入门到掌握!(三 )相关推荐

  1. 项目十二做好计算机维护,电脑组装与维护教学课件 项目十二 电脑组装和维护进阶.ppt...

    <电脑组装与维护教学课件 项目十二 电脑组装和维护进阶.ppt>由会员分享,可在线阅读,更多相关<电脑组装与维护教学课件 项目十二 电脑组装和维护进阶.ppt(33页珍藏版)> ...

  2. 第十二章 使用嵌入式SQL(三)

    文章目录 第十二章 使用嵌入式SQL(三) 主机变量 主机变量示例 用列号下标的主机变量 `NULL`和未定义的主机变量 主机变量的有效性 主机变量和程序块 第十二章 使用嵌入式SQL(三) 主机变量 ...

  3. 读博,每天要不要工作十二小时

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨公子龙 编辑丨极市平台 最近,张启发院士的一封信引发了不少争议. 主要引起争议的点是,张院士很真 ...

  4. [转]Unity3D新手教学,让你十二小时,从入门到掌握!(一)

    以下为2015年原文 首先声明一下,我用的Unity版本是4.6.6,编译环境是VS2010,其余的我会慢慢介绍,安装的过程这里我就不做讲解了,度娘那会做的比我详细.安装包可以在最下面的联系方式找我要 ...

  5. oracle传date参数十二小时,Oracle数据库中 to_date()与24小时制表示法及mm分钟的显示...

    一.在使用Oracle的to_date函数来做日期转换时,时候也许会直接的采用"yyyy-MM-dd HH:mm:ss"的格式作为格式进行转换,但是在Oracle中会引起错误:&q ...

  6. 新手探索NLP(十二)——文本聚类

    简介 聚类又称群分析,是数据挖掘的一种重要的思想,聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,或者是多维空间中的一个点.聚类分 ...

  7. javaweb学习总结(三十二)——JDBC学习入门

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  8. Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析--csdn 曹胜欢...

    新接触一个框架的目的就是想利用这个框架来为我们做一些工作,或者是让他来简化我们的工作,利用这个框架无非就是要利用这个框架所给我们提供的API去操作我们的数据,所以利用一个框架的好坏很大一部分取决于你对 ...

  9. ios基础篇(十二)——UINavgationController的使用(三)ToolBar

    UIToolBar存在于UINavigationController导航栏控制器中,而且默认被隐藏:设置UINavigationController的toolbarHidden属性可显示UIToolB ...

最新文章

  1. “手机编码速度大 PK”,你玩程序猿撸月饼了么?
  2. 这些面试题你会吗?Java-类与对象再不了解你就out啦
  3. Java构造器、静态对象、非静态对象等的初始化顺序
  4. 在物理内存中观察CLR托管内存及GC行为
  5. Android 进程监控(top命令)
  6. hdu4751Divide Groups(dfs枚举完全图集合或者bfs染色)
  7. java 的构造函数修饰符public private protected
  8. 使用XML文件方式配置log4cxx(log4cxx xml例子)
  9. 设计导航网,全心全意为设计师服务的导航网站!
  10. 虚拟机安装windows xp系统时,找不到网络连接
  11. cocos2dx基础篇(20)——基本动画CCAnimation/CCAnimate
  12. Excel 函数基本应用
  13. 正态分布是离散分布还是连续分布_连续性随机变量与正态分布——投资分析必备知识...
  14. 行业分析报告|全球与中国项目货物物流市场现状及未来发展趋势
  15. 使用h5制作一个五子棋游戏
  16. Qt5.14.2下载与安装
  17. Zookeeper启动成功,报错“Error contacting service. It is probably not running”
  18. word打带圈符号(带圈对勾为例)
  19. Echarts3-- 向echarts图表里传入数据
  20. 一个开源的论坛系统AstalPathTalk

热门文章

  1. Go语言学习笔记-数组、切片、map
  2. java int类型能表示的数值范围
  3. dwg格式文件怎么打开
  4. gpd计算机等级,GPD 文件扩展名: 它是什么以及如何打开它?
  5. 两个非常有意思的适合桌面使用的Linux task调度器: BFS和MuqSS
  6. 什么是死锁?如何避免死锁?
  7. 前端开发者如何用JS开发后台
  8. Apriori算法及例题
  9. 免费申报!5G网络Awards参评企业征集,欢迎参与!
  10. 计算机中桌面位置更改,如何更改桌面文件路径 电脑桌面优化技巧