Unity2d不用刚体的话能做unity2d碰撞检测测吗

Unity开发-使用粒子系统简单的模拟物体下落水面水溅出效果
水面效果,在三维游戏中算是一个必不可少的东西了,当然不一定用到。在Unity中水面在我看来也是做的挺巧妙的,它并没有说像我之前看到的一些文章那样直接用粒子计算张力等来模拟,毕竟那样的话会影响效率,尤其你是手机游戏的话.最近我也在研究Unity的这个水面是怎么样实现的,如果有兴趣的话可以在此之前研究下着色语言-shader。我已经着手开始看这个语言是什么样子的了。
这次主要是我在使用Unity的水面的时候,由于它真的只是一个面,且不带任何碰撞检测,在我有空做一个小游戏的时候让我控制的主角向着水面使出信仰之跃之后发现主角就像幽灵样经过水面也不会有任何效果。然后我想这略坑爹点吧,毕竟这样的话感觉太奇怪了。所以为水面能够增添点动画效果感觉还是会挺不错的.
----------------------------------
& & Unity版本信息和系统环境
& ----------------------------------
& & Unity版本:4.1.0f4
& & 系统环境:macox 10.8.5
& & 使用语言:C#
----------------------------------
我使用的是粒子系统,最后的效果大概就如下图:
下落两个高度不一样的球体,然后下落高度越高,水溅出的也就越高.同时,质量太小,不会产生水溅效果.
&关于Unity粒子系统:
由于这次的Demo我是用到了粒子系统,所以我这里顺便浅谈下Unity中的粒子系统.Unity中的粒子系统有两种的创建方式:
第一种:也是我在网络搜索最容易搜索到的,因为它旧版本的Unity就是用这种方法,但貌似现在最新版本4.3好像不支持这个了,具体我还没看,步骤是GameObject-&Create
Empty 创建一个空物体,之后添加三个组件,Emitter发射器(有两种:Elliposoid Particle
Emitter,Mesh Particle Emitter)区别主要是发射器的发射方式不一样.Particle
Animator粒子动画,Particle
Renderer粒子渲染,这三个可以在Component-&Effects-&Legacy
Particles就可以找到。
第二种:这个是我最近经常用的,新版本的粒子系统,直接GameObject-&Create
Other-&Particle System就可以.
其实我入门的时候是用第一种方法的,后来用4.0版本之后了解到了第二种方法,这个由于官方的自带的粒子系统包种的粒子效果也都是用第一种方法设计出来的(或许是我还没找到).Unity新版的粒子系统确实让我对粒子系统的一些设计理念等确实有发生变化,主要是新版的之后不仅仅的就是直接输入数值来设计了,它还有支持曲线的编辑,也就是有了一个曲线编辑器了.而且新增添的编辑场景视图(ParticleEffect)使得Unity在粒子系统的调试上更加便利.具体的话可以去参考下官方文档的ParticleSystem.我这里暂时不具体说明了,之后有时间我闲着就利用这个新版的粒子编辑器做出Demo了的话在具体说明吧(可以的话).
在这次的水溅效果的话我的思路是先实现的是基本效果,之后通过代码修改相应的值从而根据不同的情况产生不同的效果,主要是水溅射的高度.
& & 具体步骤如下:
第一步:首先创建一个粒子系统(ParticleSystem),你就会看到像下图一样的编辑界面.
& & 主要是注意下右下角的那个Particle
Effect,这个测试效果经常用到,支持暂停,停止和播放.播放速度和播放时间.
&第二步:通过曲线编辑器设计出基本的水溅的效果.
&先看下Unity的粒子系统的曲线编辑器是什么样子的.这次会简单的使用到它,注意点击OpenEditor这个按钮这个编辑器就会单独的显示出来.
&粒子系统编辑器我用的多,但是像这种的我算是第一次用了,主要还是看它的曲线编辑吧.首先曲线编辑纵坐标中的范围是根据你设置的固定值为准的,也就是Constant模式中设置的值.所以在设计的时候注意下纵坐标的范围值。
&还有,就是这个编辑器使用的话可以根据你的需求添加选项.左边图片显示的指示的加号处.
变灰色代表已经添加了,这次的话我就添加Force over
Lifetime这个选项,作用是在每一生命周期力的变化情况.添加后你将会看到下面图片的选项:
点击上图中的小三角形,就会弹出四个子选项出来,Constant(常量)/Curve(曲线)/Random Between Two
Constants(在两个常量间取随机值)/Random Between Tow
Curves(在两个曲线直接取值)。这次选择Curve.选择之前,注意记得先把Z值设成10.之后你会看到下面图片那样效果.
之后调节曲线,基本的下面蓝色框中已经提供基本预设的,你可以进行细节调整。现在先设成直线向下那个,之后把尾部的点调节下。结果如下图:
&这样你就会发现粒子就像喷泉一样的效果了.其实对于Unity自带的粒子系统你也可以用这个曲线编辑器在重新做出它那样的效果,毕竟这个有利于自己熟悉粒子系统.如果你还不清楚粒子系统是什么的话.
&最后,将Looping循环取消,Duration继续时间改为1s就可以,你可以改下贴图,改为Unity自带的水的贴图(方法是:Asserts-&import
package-&Pacticles),导入了它官方自带的粒子系统,里面含有水的贴图,当然你自己有更好的也可以自己换。后面你看到的效果大概会这样子(贴图会有所差别).
之后,创建Prefab(预设物体),创建方法有两种在Project窗口中有个Create,点击选择Prefab就可以,之后把你做的粒子系统直接拖到这个物体里面就可以了。Prefab就是用在你需要不断产生相同物体的时候,因为Prefab预设对象产生到场景中都是直接复制而不是重新创建.Prefab的使用算是一种技巧,不仅在Unity中,在游戏开发中精灵的批处理做的好的话可以为游戏的效率提高不少,尤其在手机游戏中。
& 创建Unity水面方法很简单,Assert-&import
package-&Water(有两种一种是普通版,一种是专业版,区别在于专业版是有倒影效果的),这次添加哪种都行.添加之后需要为这个水面添加碰撞检测的组件,具体方法就是Component-&Physics-&Box
Collider,如果你添加成功,你就会看到如下图所示红色框的组件:
由于水面没有设成刚体,所以记得先把Is Trigger勾上,待会使用的碰撞检测方法是OnTiggerEnter,注意:刚添加Box
Collider的时候Center和Size的值都需要调整,Center代表是位置,Size代表大小.根据情况可以调整大小,让碰撞检测变得合理。最后,如果你添加成功并且调节好了,应该就能够像下面那样的效果.
之后的话建立个物体,我建立是一个球体(GameObject-&Create
Other-&Sphere),将它设成刚体(别漏了)(Componment-&Physics-&RigidBody),将它置放在水面上一定高度,之后测试下,球是否可以下落。下面就是代码部分了.
Unity碰撞检测
首先,碰撞检测应该用什么事件呢?刚刚说了用OnTriggerEnter(Collider
obj)就好。为什么不用&OnCollisionEnter(Collision
obj)?他们区别在哪里?其实,在这个示例中,你自行测试下,效果就很明显了。IsTrigger意思是是否为触发器,如果你这个是触发器的话,那么有其它物体碰撞到它的话,就会触发OnTriggerEnter事件,当时被标记成触发器的话,那么,被标记的物体就会成幽灵模式,物体碰撞到它除了相应事件不会有其它任何反应,这一般用于相应一个记录点等功能的时候用.未标记成触发器的话那么就是响应OnCollisionEnter事件,这个的话就和Trigger相反,它会和碰撞体有具体反应。这个用在某些游戏中需要钥匙才能开门你门没开永远不能通过这种情况吧,这时候就是不用把他设成触发器了,否则就可以穿透过去了.还有注意下这两个方法具体传入的参数也是不一样的,Collider和Collision。先看下这两张图:
&上面两个分别就是Collider和Collision的源代码,首先可以发现,Collider是继承自Component的一个组件,而Collision是没有任何继承方式的.所以Collider就是一个碰撞体中的一个组件,而下面这个Collision就是用来描述碰撞体是什么样子的.还有,ContactPoint是Collision中才有的.这点需要注意下.
&OK,所以在这次的示例中,在OnTriggerEnter方法中写就可以,之后,代码要做的事情有,获取刚体相关属性,根据刚体相关属性产生水溅出的粒子系统,销毁粒子系统.
&获取相关属性,由上面所说的,这次传入的是Collider,首先明确的是,要获取什么属性?首先,物体下落到水面时候,能量主要是和两个属性有关,质量和速度(具体原理学过物理应该都知道了),所以,这次的话主要是在刚体中获取质量和速度。代码获取了刚体之后,直接把它的质量和速度读取出来就好.获取之后,计算动能,这个是水溅出的能量来源,当然,这部分能量不是全部都能够转换成为水溅出的能量,但是,要精确计算是很难的而且也没必要,所以我就设一个比例值,这个比例值计算有多少动能转换成了水溅出的能量,这个值设的只要合理就可以了。具体可以自行调试.
&获取刚体的质量和速度代码如下:
&然后,需要处理的是,如果刚体不是下落的或者刚体太轻话就不需要水溅出的效果了.此时return不做任何处理.
&计算动能值:
& & &设一个转换比例:
&之后产生粒子系统,方法直接Instantiate就可以,但是位置需要用到刚体的位置.
&下一步,获取粒子系统,通过改变它的初速度从而产生不一样的水溅出高度.
&最后,记得销毁粒子系统,其实准确的说是GameObject,因为我粒子系统是用GameObject间接生成的,所以销毁也是必要的。
&但是,什么时候销毁?当然就是粒子系统生命周期结束之后喇.在ParticleSystem类中有startLifetime这个属性,我需要说明的是,startLifetime如果你设置的是一个固定值,那么这个属性就是你那个固定值.如果你设的是一条曲线,那么这个属性的值就是你曲线区间的最大值(就是范围值).那么销毁的话直接用Destroy就好.
&效果这样就会出来了。本来这个例子以为可以写的很快的,然后写着写着然后就想到了些问题然后解决所以这里也顺便写出来,结果写了这个写了这么久.不过也罢了,本来这多思考多解决才有趣的嘛.也算是记录我的一个学习过程吧.其实一个看似简单的例子里面包含的学问确实很多.这个只有多观察发现。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。unity3d游戏开发之刚体和碰撞检测_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
unity3d游戏开发之刚体和碰撞检测
&&unity3d游戏开发之刚体和碰撞检测
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢在Unity2D中使用射线碰撞检测角色是否处于地面 VR开发教程
204有个大坑
在游戏开发中,需要知道一个角色或者物体是否在地面上是非常常见的需求。比如,当角色在地面上时,它可能会跳、攻击或者进行其它交互。检测的方法通常是使用Raycast,本质上允许你在一个不可见的线&&Raycast射线本身就是这么一条线检测任何的物理属性的物体。在这篇文章中,我将向你演示怎样使用Raycast 去检测一个物体是否在地面上。对这篇文章来说,&地面&是指Layer设置为Ground,并且都有添加了Collider组件的GameObjects.我将从一个代表角色的Player 物体的透视写起。当然,同样的技术对任何的GameObject都是可行的。
Setup&&设置
首先,我们要做的是在我们的角色脚本里面添加一个公共的 LayerMask
LayerMasks 允许我们根据碰撞体的层来过滤碰撞,也就是说我们可以限制RayCast 让其仅仅去寻找在Ground 层的物体。
将一下代码添加到角色脚本里。
public LayerMask groundL
现在,在Unity编辑器里面,选中角色,将角色的GroundLayer属性设置如图:
重复一下,这篇文章假设你已经设置了Ground Layer,并且所有的地面物体都在这一层。可根据需求来调整你的需求。
Using Raycasts 使用射线
设置好LayerMask 之后,现在可以写逻辑来检测角色是否在地面上。
在同一个角色脚本中,添加一个 IsGround 方法来体现这个逻辑,并返回一个boolean值&&true代表角色在地面上,false则相反。
public LayerMask groundL
bool IsGrounded() {
&&&&Vector2 position = transform.
&&&&Vector2 direction = Vector2.
&&&&float distance = 1.0f;
&&&&RaycastHit2D hit = Physics2D.Raycast(position, direction, distance, groundLayer);
&&&&if (hit.collider != null) {
&&&&&&&&return true;
&&&&return false;}
我们这里要做的是使用Physics 创建一个射线,用Vector2.down (Vector2(0, -1.0f) 的简写形式)来表示向下的方向。我们将Raycast 限制在groundLayer 层,这样就只有地面的物体才能被检测到,防止自身以及自身以下的其他物体的碰撞。
你会发现,我们也限制了Raycast 的距离,这也相当重要,因为当角色跳起来时,角色下方也会有很多Layer为Ground的物体&&我们只关心这些是不是在角色的正下方。值得注意的是值的使用(这里用的是1)将根据你的设置而定,所以,你可能要调整并debug来决定游戏的有效值。
当Raycast 设置完成之后,我就要开始检测是否有碰撞了,hit.collider != null.
如果不为 null,就意味着碰撞到了一个物体,角色就在地面上了。
现在你可以在余下的脚本中运行游戏来测试角色是否在地面上了并做出应有的动作。例如,你可以检测在角色跳跃之前是否在地面上。
void Update() {
&&&&int yMovement = (int) Input.GetAxisRaw(&Vertical&)
&&&&if (yMovement == 1) {
&&&&&&&&Jump();
void Jump() {
&&&&if (!IsGrounded()) {
&&&&&&&&return;
&&&&} else {
Debugging&&调试
碰撞检测的一个实用的小技巧是使用Debug.DrawRay 方法。这方法可以在Unity Editor模式下将射线显示出来,但真正运行的游戏上是看不到的。如下代码,将DrawRay 添加到 IsGrounded函数中:
[C#] 纯文本查看 复制代码
bool IsGrounded() {
&&&&&&&&&&&&&&&&...
&&&&&&&&Debug.DrawRay(position, direction, Color.green);
&&&&&&&&&&&&&&&&RaycastHit2D hit = Physics2D.Raycast(position, direction, distance, groundLayer);
&&&&&&&&...}
现在,在Unity Editor中,可以在角色身上看到一条绿色的线,如图,这样就可以验证你的碰撞信息了。
这是很方便的,因为你可以监视角色移动时的碰撞信息,以及大小和位置是否正确。
<font color=#-05<font color=#-04<font color=#-31<font color=#-01<font color=#-01<font color=#-30<font color=#-30<font color=#-28<font color=#-28<font color=#-27
想知道在Unity中如何将游戏中角色对话的唇型与面部微表情达到次时代的水准吗?想知道...
近日,RLTY CHK工作室的联合创始人Nick Robinson发布了一篇文章,以媒体天师麦克卢汉...
VR设计师和开发者们开始着手如何让VR环境及体验更加有趣、逼真。以下是一些关于如何为room...
笔者在为《幻想装置》和《工作模拟》制作出混合现实的预告片以后,研究了更深层次的VR...
关于用EasyAR SDK 搭建AR 开发环境的教程,我已经写过很多了,不懂得朋友可以看下我之...}

我要回帖

更多关于 unity 2d刚体 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信