貌似有一段时间没更新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. poj 3680 Intervals

    给定N个带权的开区间,第i个区间覆盖区间(ai,bi),权值为wi.现在要求挑出一些区间使得总权值最大,并且满足实轴上任意一个点被覆盖不超过K次. 1<=K<=N<=200.1< ...

  2. java 随机数 优惠码 生成 随机字串

    package test; import java.util.HashSet; import java.util.Random; import java.util.Set; public class ...

  3. 增量关联规则挖掘—FUP算法

    一.背景介绍 关联规则( Association rule)概念最初由Agrawal提出,是数据挖掘的一个重要研究领域, 其目的是发现数据集中有用的频繁模式. 静态关联规则挖掘,是在固定数据集和支持度 ...

  4. javascript读取xml文件

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...

  5. 用File判断D盘下面是否还有txt文件

    package cn.idcast; import java.io.File; public class File1 { public static void main(String[] args) ...

  6. sqlalchemy默认时间

    我查到的sqlalchemy默认时间有2种: from sqlalchemy.sql import func time_created = Column(DateTime(timezone=True) ...

  7. js 时间相关函数

    实例: <!doctype html> <html> <head> <meta charset="utf-8"> <title ...

  8. Loadrunner安装

    安装参考网址:http://www.cnblogs.com/yangxia-test/archive/2012/10/30/2746621.html 本人验证过的,不自己写了 另附Loadrunner ...

  9. mysql中find_in_set()函数的使用

    首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...

  10. 深入理解javascript原型和闭包(7)——原型的灵活性

    在Java和C#中,你可以简单的理解class是一个模子,对象就是被这个模子压出来的一批一批月饼(中秋节刚过完).压个啥样,就得是个啥样,不能随便动,动一动就坏了. 而在javascript中,就没有 ...