开发者社区> 技术小美> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

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

更多精彩教程请关注我的微博

SouthEast

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

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

SouthEast

切记在选择自定义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 returnnew 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第三方插件么?以前的项目你都负责过那些?你对角色动作换装熟悉么?如果有一些大公司或许还会问图形学的相关知识。但我感觉这些都是在你已经牢牢掌握了基础知识的前提下才有必要进一步掌握的,所以说基础你都牢牢掌握了么?细节还是不能忽视的!!!废话不多说了,进行碰撞检测


SouthEast

SouthEast


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

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

SouthEast

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

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

问题:

SouthEast

解答:

SouthEast


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

SouthEast

然后碰撞的物理效果

SouthEast

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

SouthEast

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

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

Center

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

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

SouthEast

这里用脚本做一个随机的位置摆放,上下波动在[-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. publicclass randompos : MonoBehaviour {  

  8. publicfloat speed;  

  9. privatefloat movespeed;  

  10. publicfloat minPositionX;  

  11. publicfloat terPositionX;  

  12. publicfloat 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://114.92.240.43/dingxiaowei/FlappyDragon.html





















本文转蓬莱仙羽 51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1374260,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Study - 基于Harris的角点特征检测
Study - 基于Harris的角点特征检测
63 0
《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
《Drools7.0.0.Final规则引擎教程》第4章 4.2 agenda-group
65 0
数据中台建设引擎Dataphin亲测体验报告一:功能完备性测评
作者:张骞 更多内容详见数据中台官网 https://dp.alibaba.com 近期公司采购了阿里云智能数据构建与管理产品Dataphin,推广大数据和IT部门使用,说需要统一数据研发规范性,还要释放数据生产力,提高业务需求响应效率,作为大数据部门一个小分析师,有幸也体验了这个阿里云上神秘的产品,看看是哪里比较厉害,替代了原有的数据研发平台。
4507 0
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.17. 连接参数的 LDAP 查找
33.17. 连接参数的 LDAP 查找 如果libpq已经在编译时打开了 LDAP 支持(configure的选项--with-ldap),就可以通过 LDAP 从一个中央服务器检索host或dbname之类的连接参数。
1213 0
IBM向客户发放了一批“染毒”的U盘,现紧急建议物理销毁
本文讲的是IBM向客户发放了一批“染毒”的U盘,现紧急建议物理销毁,近日,IBM公司发布安全公告指出,该公司不小心将一些感染恶意程序的USB驱动器寄给了用户,这些USB驱动器中包含了部分 Storwize 系统的初始化工具。
1521 0
bboss mvc控制器实现etag和last modify两种http缓存机制
bboss mvc控制器实现etag和last modify两种http缓存机制(本文参考《聊聊高并发系统之HTTP缓存》编写) 1.缓存控制器实现 缓存控制器的类文件: HttpCache.
1012 0
can't able to update the design capacity in bq27441-G1
/*************************************************************************** * can't able to update the design capacity in bq27441-G1 * 声明...
851 0
.NET 邮件传送功能实现(smtp.qq.com)
记住端口和SMTP服务器地址(post:25,url:smtp.qq.com) SendMail.cs   1 using System; 2 using System.Configuration; 3 using System.
847 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
360°全景视频播放器的实现原理
立即下载
3D动画的菜谱式灯光与云渲染
立即下载
《如何制作一个水平仪》
立即下载