休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放相关的知识,希望能为你提供帮助。
貌似有一段时间没更新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提交,然后
下面我们来进行碰撞检测,
[csharp]view plaincopyprint?
文章图片
文章图片
- //鼠标左击控制主角精灵移动
-
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)
-
{
- if (other.tag == "flower")
-
{
-
print("Trigger触发中了");
-
}
-
}
- void OnTriggerExit(Collider other)
-
{
- if (other.tag == "flower")
-
{
-
print("Trigger结束了");
-
}
-
}
【[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放】
文章图片
文章图片
看到能够成功的进行碰撞检测,大功告成!
但后来问题又出现了,就是要得拖动小龙主动去碰撞花朵,才能检测出碰撞,如果不人为拖动,就没有出现碰撞检测,又觉得纳闷了,后来发现了碰撞的条件,可以对比这这个表格,碰撞列表
文章图片
看官方的论坛,有人也碰到过这问题,我这儿给出地址,或许对你以后碰到这问题有所帮助
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],这样使得游戏更逼真!
[csharp]view plaincopyprint?
文章图片
文章图片
- using UnityEngine;
- using System.Collections;
- /// <
summary>
- /// 让花朵的位置随机,挂在doubleflower上
- /// <
/summary>
- //小花朵上下位置范围是[-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 <
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);
-
}
- }
在线演示:http://114.92.240.43/dingxiaowei/FlappyDragon.html
推荐阅读
- 开源计划 kzfont——bmfont 的 texturepacker 导出插件
- 挨踢人物传关东升(成功的路上很寂寞,贵在坚持(第20期))
- [Unity3D+算法]一小时做个2048
- Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉虫记之控制场景文件中的骨骼动画
- Java如何使用Tessdata做OCR图片文字说明,看这篇就够了~
- 如何在JavaScript中自定义Google Maps颜色和样式
- 如何使用JavaScript(WebRTC)在浏览器中录制带音频的视频
- 如何使用JavaScript将二进制字符串转换为可读字符串,反之亦然
- 如何区分HTML并使用JavaScript在HTML中生成输出