[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放
2019独角兽企业重金招聘Python工程师标准>>>
貌似有一段时间没更新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 return new 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结束了");
}
}
这里设置花的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],这样使得游戏更逼真!
[csharp] view plaincopyprint?
using UnityEngine;
using System.Collections;
/// <summary>
/// 让花朵的位置随机,挂在doubleflower上
/// </summary>
//小花朵上下位置范围是[-0.82,0]
public class randompos : MonoBehaviour {
public float speed;
private float movespeed;
public float minPositionX;
public float terPositionX;
public float 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://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
====================== 相互学习,共同进步 ===================
转载于:https://my.oschina.net/dingxiaowei/blog/207663
[Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放相关推荐
- Unity3D优化技巧系列三
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- ChromeFK插件推荐系列三:购物助手插件推荐
本次分享几个购物助手chrome扩展插件chromefk.希望对你有所帮助. 1.慢慢买 - 历史价格查询 在浏览购物网站时,只需要在商品详情页单击鼠标右键,选择右键菜单中的"查看历史价格& ...
- CAD插件学习系列教程(三) 高程点内插工具
我是王石头,这是CAD插件学习系列教程的第三篇,这次推荐一款高程点内插的cad工具. 此工具由CAD lisp语言编制而成. 使用方法 1. cad界面下输入appload命令加载: 2. 点击加载后 ...
- 鸿蒙系统能把游戏窗口化吗,家里装上华为智慧屏S系列,这三个功能,让我爱不释手!...
现在很多科技新品一出来,网友就在吐槽要做减法,不是继续做加法.其实这一想法在智能电视领域也挺普遍的,在智慧屏没出来前,几乎大多数品牌都在执着一块屏的素养,亦或是芯片的迭代,功能技术越来越多,用户也越来 ...
- 【Unity3D应用案例系列】Unity3D中实现抽奖功能
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 本博文标题和内容参考: 被黑心商家坑了N次,探究抽奖背后的秘密 - ...
- 家庭媒体中心解决方案(三、 群晖系列nas基本功能使用指南篇1)
群晖系列nas基本功能及简要使用指南篇 由于群晖的官方使用说明仅限于群晖NAS的安装和自带的应用的简单介绍,而网络上的关于NAS的各个功能的介绍和使用又是百家争鸣.广而不全.本文以下篇幅针对群晖NAS ...
- 【Unity3D插件】EasyAR插件分享《AR使用及开发案例》
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 这篇文章介绍如何使用EasyAR.unitypackage配置EasyAR ...
- 【Unity3D应用案例系列】答题系统开发
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 这是本专栏系列的第一篇,答题系统的开发. 这个答题系统,可以从文本 ...
- Unity3D插件 AnyPortrait 2D骨骼动画制作
一.前言 AnyPortrait是一个创建2D角色动画制作的Unity拓展编辑器插件. AnyPortrait提供了很多功能,让你可以在Unity里面就完成动画的制作. 使用AnyPortrait插件 ...
最新文章
- 元宵节就要到了,花灯要不要来一盏?3D的那种
- Ubuntu 17.4下如何安装和配置flash player
- 关于TXT转CHM的完整解决方式
- UTC时间戳-时间字符串之间互相转化
- 【用word快速输入公式】希腊字母名称和大小写
- C++PrimerPlus学习——第九章编程练习
- 用php循环星期一到星期日,php – 获取最后一个星期一 – 星期日的日期:有更好的方法吗?...
- 情人节程序员用HTML网页表白【时光不老,我们不散love520】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- 淘宝客、返利机器人详细解读(个人理解)
- 数据化运营之会员数据化运营
- JAVA里面一加到一百等于多少_从1加到100等于多少 【求和算法汇总】
- 高斯消元法求逆矩阵 matlab,matlab中求逆矩阵的高斯消元法实现的代码
- 卡巴虚拟机启发式查毒的绕过方法
- hive大数据量实现分页查询,java结合mybatis及多数据源(hive、MySQL)
- vivo手机计算机记录怎么找回,如何从Vivo手机恢复已删除的照片,您将在阅读后知道...
- python画三维立体图完整代码_python之画三维图像
- xp进入win7计算机要密码怎么设置密码,XP系统设置直接跳过密码的多种方法
- android 拔插键盘自动切换输入法
- 把int转换为char把int转换为char
- 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号