unity怎么让水体现unity 水墨风格渲染

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就好.
&效果这样就会出来了。本来这个例子以为可以写的很快的,然后写着写着然后就想到了些问题然后解决所以这里也顺便写出来,结果写了这个写了这么久.不过也罢了,本来这多思考多解决才有趣的嘛.也算是记录我的一个学习过程吧.其实一个看似简单的例子里面包含的学问确实很多.这个只有多观察发现。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。unity能做水墨风格的地形么_百度知道
unity能做水墨风格的地形么
我有更好的答案
2.创建一个带透明的图形(推荐PNG格式),分辨率必须是2的幂次方宽高相等(如256*256)。需要突出显示的地方用黑色,反之保持透明。3.导入图形,命名必须从brush_0开始。不能中断,比如brush_0-10都有、不能突然出现brush_12,否则只有brush_0-10不会有brush_12。4.重启动unity3d,编辑地形和绘制贴图就可以看到新增加的笔刷了。
采纳率:83%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。如何通过PS把这幅画改成水墨或者水彩风格? - 知乎14被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答33 条评论分享收藏感谢收起4添加评论分享收藏感谢收起写回答&鍔犺浇涓}

我要回帖

更多关于 unity 水墨 的文章

更多推荐

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

点击添加站长微信