天天看点

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

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

<a href="http://weibo.com/dingxiaowei2013" target="_blank">更多精彩教程请关注我的微博</a>

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

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

[Unity3D插件]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提交,然后

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

//鼠标左击控制主角精灵移动

   IEnumerator OnMouseDown()  

   {  

       print("MouseDown");  

       Vector3 screenPosition = Camera.main.WorldToScreenPoint(transform.position);  

       Vector3 mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);  

       Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(mScreenPosition);  

//鼠标左击

while (Input.GetMouseButton(0))  

       {  

           mScreenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);  

           Vector3 pos = offset + Camera.main.ScreenToWorldPoint(mScreenPosition);  

           pos.z = 0;  

           transform.position = pos;  

           yield returnnew WaitForFixedUpdate();  

       }  

   }  

void OnTriggerEnter(Collider other)  

if (other.tag == "flower")  

           print("Trigger触发了");  

void OnTriggerStay(Collider other)  

           print("Trigger触发中了");  

void OnTriggerExit(Collider other)  

           print("Trigger结束了");  

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

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

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

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

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

<a href="http://answers.unity3d.com/questions/433472/objects-passing-through-collision-because-of-trans.html" target="_blank">http://answers.unity3d.com/questions/433472/objects-passing-through-collision-because-of-trans.html</a>

<a href="http://answers.unity3d.com/questions/187684/moving-object-with-transformposition-ignore-other.html" target="_blank">http://answers.unity3d.com/questions/187684/moving-object-with-transformposition-ignore-other.html</a>

问题:

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

解答:

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

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

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

然后碰撞的物理效果

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

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

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

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

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

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

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

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

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

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

using UnityEngine;  

using System.Collections;  

/// &lt;summary&gt;

/// 让花朵的位置随机,挂在doubleflower上

/// &lt;/summary&gt;

//小花朵上下位置范围是[-0.82,0]

publicclass randompos : MonoBehaviour {  

publicfloat speed;  

privatefloat movespeed;  

publicfloat minPositionX;  

publicfloat terPositionX;  

publicfloat rannum;//波动范围

// Use this for initialization

void Start () {  

       minPositionX = -6;  

       terPositionX = 0;  

       rannum = 0.1f;  

//执行一次位置的随机变动

float ran = GetRandomNum(-0.82f, 0f);  

float ran1 = GetRandomNum(-rannum, rannum);  

//print(ran);

       transform.localPosition = new Vector3(transform.localPosition.x+ran1, ran, transform.localPosition.z);  

// Update is called once per frame

void Update () {  

       movespeed = speed * Time.deltaTime;  

       transform.Translate(Vector3.left * movespeed, Space.World); //向左移动

if (transform.localPosition.x &lt; minPositionX)  

float ran = GetRandomNum(-0.82f, 0f); //上下波动范围

float ran1 = GetRandomNum(-rannum, rannum);//左右波动范围

           print("上下波动:"+ran+",左右波动:"+ran1);  

           transform.localPosition = new Vector3(terPositionX+ran1, ran, transform.localPosition.z);  

float GetRandomNum(float min,float max)  

return Random.Range(min, max);  

}  

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

继续阅读