貌似有一段时间没更新2dtoolkit系列了,这段时间一直在忙着其他事情,今天开始继续这个插件系列的教程,网上搜索,貌似关于这个插件的教程无非还是跟官方的教程很类似,有的甚至都没有自己照着亲手实践一遍就直接Copy,对这样博客的文章感觉起步到任何作用,对自己没有什么深刻的理解,对他人来说也只是搜出来一份相同品,也没什么收获,还都浪费了大家的时间!所以我决定通过这个小游戏项目来驱动式的学习这个2d插件,今天我看了之前写的系列一和系列二的文章,貌似还收到了一些不错的效果,不少人鼓励我继续写下去,51CTO,CSDN,9Teach等各大技术论坛都纷纷转载并且将这个系列推到了论坛首页,今天收到份邮件,惊讶的发现原来我的文章也上头条了,这无疑是对我的文章的一种肯定,我将更有信心坚持下去!

但如果学习2dtoolkit插件仅仅是看官方的文档操作,不通过自己去动手实践,不注意细节可能是会碰到许多问题,这不我今天是深有感触哇!一直到吃晚饭之前都是摸索一个问题,就是关于碰撞检测的问题,我在小花上添加了自定义的不规则碰撞器,这里可以参考系列一(点击打开)如何创建带有碰撞器的精灵集合的,其实在那儿操作的时候就留了一个“隐患”,没注意一个细节,导致今天很纠结,其实也不是没注意了,只是那时候也不知道要注意这么一点!

还是回到之前的创建精灵集合,按照之前的操作,来到这一步

切记在选择自定义Collider的时候要勾选上Convex,这是为什么呢?或许有人要问。原因:

meshcollider不能和非凸边形发生碰撞
Mesh Colliders cannot collide with each other unless they are marked as Convex. Therefore, they are most useful for background objects like environment geometry.

我猜想可能是跟碰撞算法有关,具体底层的碰撞算法是怎么写的,我只能是猜测,计算的是凸多边形之间的碰撞检测,这里自定义碰撞边缘,默认的就是MeshCollider碰撞,BoxCollider碰撞是矩形框碰撞,其实也就是特殊的凸多边形了,但无疑碰撞的没那么精确而已。就是因为这个,我看论坛还有人家博客上写的这个2dtoolkit教程都没有这个提示,这让新手会很纠结!这点我比较欣赏雨凇大哥,写博客写的很详细!赞一个!但搜关于这个插件的教程,他也还没写,所以就只能自己摸索了,哈哈,正好也给我了这么个自己机会!画好不规则边框以后,点击Commit提交,然后

下面我们来进行碰撞检测,

  1. //鼠标左击控制主角精灵移动
  2. IEnumerator OnMouseDown()
  3. {
  4. print("MouseDown");
  5. Vector3 screenPosition = Camera.main.WorldToScreenPoint(transform.position);
  6. Vector3 mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
  7. Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(mScreenPosition);
  8. //鼠标左击
  9. while (Input.GetMouseButton(0))
  10. {
  11. mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
  12. Vector3 pos = offset + Camera.main.ScreenToWorldPoint(mScreenPosition);
  13. pos.z = 0;
  14. transform.position = pos;
  15. yield return new WaitForFixedUpdate();
  16. }
  17. }
  18. void OnTriggerEnter(Collider other)
  19. {
  20. if (other.tag == "flower")
  21. {
  22. print("Trigger触发了");
  23. }
  24. }
  25. void OnTriggerStay(Collider other)
  26. {
  27. if (other.tag == "flower")
  28. {
  29. print("Trigger触发中了");
  30. }
  31. }
  32. void OnTriggerExit(Collider other)
  33. {
  34. if (other.tag == "flower")
  35. {
  36. print("Trigger结束了");
  37. }
  38. }

这里设置花的tag为flower,然后拖动小龙进行跟花碰撞,哦,忘了说一点了,还记得我之前转载过公司的基础面试题么,虽然遭到一些自认为是老手的人的“嘲讽”,评论说有必要整理这么简单的问题吗?现在看来我觉得还是有必要的,至少我从中知道了一点,碰撞检测的条件,必须具有刚体和碰撞器,或许好多人就知道必须有碰撞器,可能会忽略了刚体,我亲自试验过,还真是很被容易忽视,然后就又纠结怎么碰撞不了的呢?虽然去公司都会问一些高级的问题:一般都是NGUI有没有很熟,有没有扩展;有没有内存优化;会不会网络资源更新;项目中遇到过的难题以及解决办法?会写Shader么?会用Android和IOS第三方插件么?以前的项目你都负责过那些?你对角色动作换装熟悉么?如果有一些大公司或许还会问图形学的相关知识。但我感觉这些都是在你已经牢牢掌握了基础知识的前提下才有必要进一步掌握的,所以说基础你都牢牢掌握了么?细节还是不能忽视的!!!废话不多说了,进行碰撞检测

看到能够成功的进行碰撞检测,大功告成!

但后来问题又出现了,就是要得拖动小龙主动去碰撞花朵,才能检测出碰撞,如果不人为拖动,就没有出现碰撞检测,又觉得纳闷了,后来发现了碰撞的条件,可以对比这这个表格,碰撞列表

看官方的论坛,有人也碰到过这问题,我这儿给出地址,或许对你以后碰到这问题有所帮助

http://answers.unity3d.com/questions/433472/objects-passing-through-collision-because-of-trans.html

http://answers.unity3d.com/questions/187684/moving-object-with-transformposition-ignore-other.html

问题:

解答:

如果想两个物体只发生物理碰撞效果,就是不会穿透,就不勾选IsTrigger选项

然后碰撞的物理效果

会发现小龙的最都被撞歪了,花也被“推”到后面去了,哇咔咔,这就起到物理效果,但我们想要的效果并不是这样,我们是需要能检测出碰撞事件的,所以就勾选其中的一个IsTrigger即可,就能触发OnTriggerEnter()方法

看下面检测到了碰撞,代码跟上图一样!就不重复了!

一直用的都是csdn,但苦恼的是CSDN没有移动端的app,所以最近搞了个移动app,我将所有的博客都搬到移动平台了,可以扫描一下即可在移动平台关注我的最新文章。

被碰撞的问题搞的纠结了两天,总算是告一段落,写下来就是花朵的随机摆放,也比较简单。

首先在场景中做一个预设,包含一上一下两朵花,然后拖放四个到场景中

这里用脚本做一个随机的位置摆放,上下波动在[-0.8f,0],左右波动在[-0.1f,0.1f],这样使得游戏更逼真!

  1. using UnityEngine;
  2. using System.Collections;
  3. /// <summary>
  4. /// 让花朵的位置随机,挂在doubleflower上
  5. /// </summary>
  6. //小花朵上下位置范围是[-0.82,0]
  7. public class randompos : MonoBehaviour {
  8. public float speed;
  9. private float movespeed;
  10. public float minPositionX;
  11. public float terPositionX;
  12. public float rannum;//波动范围
  13. // Use this for initialization
  14. void Start () {
  15. minPositionX = -6;
  16. terPositionX = 0;
  17. rannum = 0.1f;
  18. //执行一次位置的随机变动
  19. float ran = GetRandomNum(-0.82f, 0f);
  20. float ran1 = GetRandomNum(-rannum, rannum);
  21. //print(ran);
  22. transform.localPosition = new Vector3(transform.localPosition.x+ran1, ran, transform.localPosition.z);
  23. }
  24. // Update is called once per frame
  25. void Update () {
  26. movespeed = speed * Time.deltaTime;
  27. transform.Translate(Vector3.left * movespeed, Space.World); //向左移动
  28. if (transform.localPosition.x < minPositionX)
  29. {
  30. float ran = GetRandomNum(-0.82f, 0f); //上下波动范围
  31. float ran1 = GetRandomNum(-rannum, rannum);//左右波动范围
  32. print("上下波动:"+ran+",左右波动:"+ran1);
  33. transform.localPosition = new Vector3(terPositionX+ran1, ran, transform.localPosition.z);
  34. }
  35. }
  36. float GetRandomNum(float min,float max)
  37. {
  38. return Random.Range(min, max);
  39. }
  40. }

转载请注明出处,谢谢!http://blog.csdn.net/dingxiaowei2013/article/details/21036859

在线演示:http://114.92.240.43/dingxiaowei/FlappyDragon.html

==================== 迂者 丁小未 CSDN博客专栏=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:375151422,858550,6348968         cocos2dx QQ群:280818155

====================== 相互学习,共同进步 ===================

[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放的更多相关文章

  1. [Unity3D插件]2dtoolkit系列二 动画精灵的创建以及背景图的无限滚动

    经过昨天2dtoolkit系列教程一的推出,感觉对新手还有有一定的启发作用,引导学习使用unity 2dToolKit插件的使用过程,今天继续系列二——动画精灵的创建,以及背景图的无限循环滚动,在群里 ...

  2. Unity3D插件-自制小插件、简化代码便于使用(新手至高手进阶必经之路)

    Unity3D插件-简化代码.封装功能 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 FindT() ...

  3. [unity3d插件]2dtoolkit系列一 创建精灵

    从今天开始要做一个2d游戏,由于之前都是做cocos2dx的,然后接触了一段时间的unity3d,都是做3D方面的东西,得知要做2d游戏还是有点开心的,或许因为不想丢失之前的2d游戏的一些思想,然后接 ...

  4. Unity3D脚本中文系列教程(三)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302323886/ Unity3D脚本中文系列教程(二) 示,属性不被序列化或显示 ...

  5. 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)

    使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...

  6. .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能

    原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能         接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...

  7. 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家

    系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...

  8. Web 开发人员和设计师必读文章推荐【系列三十】

    <Web 前端开发精华文章推荐>2014年第9期(总第30期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  9. Unity3D脚本中文系列教程(十四)

    http://dong2008hong.blog.163.com/blog/static/469688272014032134394/ WWWFrom 类Unity3D脚本中文系列教程(十三)辅助类. ...

随机推荐

  1. ReactNative 当前url和cookies的获取

    前面大概介绍了react-native的运行helloword级别的入门,所以之后简单的东西就不写了,毕竟官网上都能够找到. reactnative官网:https://facebook.github ...

  2. 求n!质因数分解之后素数a的个数

    n!质因数分解后P的个数=n/p+n/(p*p)+n/(p*p*p)+......直到n<p*p*p*...*p //主要代码,就这么点东西,数学真是厉害啊!幸亏我早早的就退了数学2333 do ...

  3. 自学 Java 怎么入门

    自学 Java 怎么入门? 595赞同反对,不会显示你的姓名     给你推荐一个写得非常用心的Java基础教程:java-basic | 天码营 这个教程将Java的入门基础知识贯穿在一个实例中,逐 ...

  4. bandicam如何录制视频

    我们一般都很熟悉这类软件:屏幕录制专家和kk录制等,这些都是国内比较优秀的作品.不过exe的封装格式以及录制的清晰度让人很纠结.所以这里要为大家分享的是一款韩国人写录制软件Bandicam.Bandi ...

  5. 搭建haproxy

    1:下载haproxy wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz2:解压,编译,安装 tar zxf hapr ...

  6. C#内存管理与垃圾回收

    垃圾回收还得从根说起,就像生儿育女一样. 根:根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null.根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为 ...

  7. jquery实现简单瀑布流布局(续):图片懒加载

    # jquery实现简单瀑布流布局(续):图片懒加载 这篇文章是jquery实现简单瀑布流布局思想的小小扩展.代码基于前作的代码继续完善. 图片懒加载就是符合某些条件时才触发图片的加载.最常见的具体表 ...

  8. log4j日志工具

    一.关于日志 1.日志定义: 项目在运行阶段产生的信息 2.日志级别 最常见的日志级别有4个: error :错误日志 warn:警告日志 info:流程日志 debug:调试日志   优先级从高到低 ...

  9. Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...

  10. Linux中挂载window7的共享文件

    window7主机: 设置要共享的文件夹 Linux Fedora: 0 su su root 1 samba-client yum install samba-client 2 cifs-utils ...