【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2690|回复: 5

[基础技术] 使用Unity3D自带动画系统制作下雨效果

[复制链接]
发表于 2014-2-14 14:16:27 | 显示全部楼层 |阅读模式

之前看了以前版本的unity3d demo AngryBots ,觉得里面的下雨效果不错,刚好前段时间学习了,写出来跟大家分享下,直接开始。

使用自带动画系统制作下雨效果。

先制作下雨的雨滴涟漪

步骤1:

在 project中新建文件夹,命名为rainFX。将图片素材RainStreak及Ripple导入到rainFX文件夹中,创建一个plane,改名 为RippleObj,创建一个material,命名为ripple。(将导入的Ripple贴图的Alpha from Grayscale 打上勾,以使贴图的背景透明)

步骤2:

将ripple材质赋给RippleObj。

修 改材质的Shader为Particles/Addtive,将Ripple贴图赋给ripple材质的Texture,在inspector窗口中修改 Particle Texture,Tilling的x值设为0.1666,y为1,offset的x为0.8333,y为0。选中RippleObj,将Shader下的 Tint Color改为白色。(改为白色为了使雨滴更加明显一点)

修改后效果:

步骤3:

选中RippleObj,按Ctrl+6,调出Animation窗口,点击窗口下的Ripple(material),会发现下面都是灰色不可选状态。

点击RippleObj右边的一个小按钮,会出现[Create New Clip],点击。此时Ripple(Material)下的选项都已可用。

点击后会出现下面的对话框,提示保存动画文件。命名为RainAnimation,保存。

步骤4:

选择Ripple(Material)下的Main Tex.offset.x,点击右边的小横线->Addkey。

拖动时间轴到0.05,再次Addkey,修改offset.x为0.1666。分别在0帧Addkey,offset.x为0,0.05帧 Addkey,offset.x为0.1666,0.1帧Addkey,offset.x为0.3333,0.15帧Addkey,offset.x为 0.5,0.2帧Addkey,offset.x为0.6666,0.25帧Addkey,offset.x为0.8333。效果图如下:

步骤5:

此时的Animation窗口中有一条从0.0—0.25的红色斜线,用鼠标框选六个关键帧,右键—>Both Tangents—>Constant(右键需在红色的关键点上点击)。此时斜线被改为梯形上升的线。选择Tint Color.a,在0.0帧修改Tint Color.a为1,0.25帧即最后一帧设置Tint Color.a为0。使动画有一个透明渐变的效果。

到此,涟漪效果制作完成。

步骤6:开始添加脚本,控制涟漪的消失,脚本名:RippleDestroy。

[size=1em]
[size=1em]1

[backcolor=rgb(238, 238, 238) !important][size=1em]2

[size=1em]3

[backcolor=rgb(238, 238, 238) !important][size=1em]4

[size=1em]5

[backcolor=rgb(238, 238, 238) !important][size=1em]6

[size=1em]7

[backcolor=rgb(238, 238, 238) !important][size=1em]8

[size=1em]9

[backcolor=rgb(238, 238, 238) !important][size=1em]10

[size=1em][size=1em]using UnityEngine;
[backcolor=rgb(238, 238, 238) !important][size=1em]using System.Collections;

[backcolor=rgb(238, 238, 238) !important][size=1em]public class RippleDestroy : MonoBehaviour
[size=1em]{
[backcolor=rgb(238, 238, 238) !important][size=1em]    public void DestroyMe()
[size=1em]    {
[backcolor=rgb(238, 238, 238) !important][size=1em]        Destroy(gameObject);    //删除自身
[size=1em]    }
[backcolor=rgb(238, 238, 238) !important][size=1em]}



将脚本赋给RippleObj。

在Animation窗口中,最后一帧即0.25帧处,点击右边的Add Event按钮,在0.25帧添加一个事件并将DestroyMe()赋给Function。

步骤7:

将RippleObj拖到rainFX文件夹中,使之成为一个prefab。然后可以将场景中的RippleObj删掉。

创建一个空物体。GameObject—>Create Empty。改名为ripple,此时场景中只有Main Camera,ripple。

创建一个rippleFX脚本:

[size=1em]
[size=1em]1

[backcolor=rgb(238, 238, 238) !important][size=1em]2

[size=1em]3

[backcolor=rgb(238, 238, 238) !important][size=1em]4

[size=1em]5

[backcolor=rgb(238, 238, 238) !important][size=1em]6

[size=1em]7

[backcolor=rgb(238, 238, 238) !important][size=1em]8

[size=1em]9

[backcolor=rgb(238, 238, 238) !important][size=1em]10

[size=1em]11

[backcolor=rgb(238, 238, 238) !important][size=1em]12

[size=1em]13

[backcolor=rgb(238, 238, 238) !important][size=1em]14

[size=1em]15

[backcolor=rgb(238, 238, 238) !important][size=1em]16

[size=1em]17

[backcolor=rgb(238, 238, 238) !important][size=1em]18

[size=1em]19

[backcolor=rgb(238, 238, 238) !important][size=1em]20

[size=1em]21

[backcolor=rgb(238, 238, 238) !important][size=1em]22

[size=1em]23

[backcolor=rgb(238, 238, 238) !important][size=1em]24

[size=1em]25

[size=1em][size=1em]using UnityEngine;
[backcolor=rgb(238, 238, 238) !important][size=1em]using System.Collections;

[backcolor=rgb(238, 238, 238) !important][size=1em]public class rippleFX : MonoBehaviour
[size=1em]{
[backcolor=rgb(238, 238, 238) !important][size=1em]    public GameObject rippleObj;    //涟漪实例
[size=1em]    int ti;        //计时器
[backcolor=rgb(238, 238, 238) !important][size=1em]     
[size=1em]    void Start ()
[backcolor=rgb(238, 238, 238) !important][size=1em]    {
[size=1em]         
[backcolor=rgb(238, 238, 238) !important][size=1em]    }
[size=1em]     
[backcolor=rgb(238, 238, 238) !important][size=1em]    void Update ()
[size=1em]    {
[backcolor=rgb(238, 238, 238) !important][size=1em]        ti++;
[size=1em]        if(ti>=5)        //每隔5帧,计时器发生作用
[backcolor=rgb(238, 238, 238) !important][size=1em]        {
[size=1em]            GameObject tempObj=Instantiate(rippleObj) as GameObject;        //复制涟漪物体
[backcolor=rgb(238, 238, 238) !important][size=1em]            tempObj.transform.parent=gameObject.transform;                //设置子物体
[size=1em]            tempObj.animation.Play();                                    //播放动画文件
[backcolor=rgb(238, 238, 238) !important][size=1em]            tempObj.transform.position=transform.position+new Vector3(Random.Range(10,-10),0,Random.Range(10,-10));//移动涟漪物体到一个随机位置
[size=1em]        }
[backcolor=rgb(238, 238, 238) !important][size=1em]    }
[size=1em]}



将rippleFX脚本赋给空物体ripple,再将prefab物体RippleObj赋给ripple的脚本的变量RippleObj即可。


点击运行,即可出现地上很多涟漪的效果。

下雨效果分两部分:地上的涟漪和空中的雨滴。

现在开始使用unity3d的粒子系统制作下落的雨滴

步骤1:

新建一个粒子系统。

GameObject—>Create other—>Particle System。改名为raindrop。

步骤2:

新建一个材质(material),改名为跟贴图一样的名称RainStreak,修改材质的Shader为Particles/Addtive。

将贴图RainStreak赋给材质,修改Tiling的x为8。

修改RainStreak贴图的Wrap Mode为clamp(8为使贴图在单位面积上显示8个,即使单个贴图的面积变小,然后修改Wrap Mode为clamp即使粒子系统中显示的粒子为变小后的单个贴图)。

步骤3:

将RainStreak的Material赋给粒子系统的Render下面的Material。

此时粒子系统中显示的即为雨滴的贴图。

步骤4:

修改粒子系统的Shape,使之变为圆柱形。

调节参数Emission下的Rate,可修改雨滴密度。

Rotate by Speed下的Angular Velocity可改变雨滴的下落方向。

调节各个参数完毕后,即可达到最终效果(多调下参数,以便达到更好的效果)。

到此,下雨效果完成(这里的效果看起来比较糙...)。

另外,可以把所用到的材质、贴图、脚本等资源全部放到rainFX文件夹中,方便以后使用的时候直接拿过来用就可以了~~

我把素材及工程源文件上传到网盘,童鞋们可以下载来看看~~


发表于 2014-2-16 20:03:56 | 显示全部楼层
很好的资料,学习了!
发表于 2014-2-16 20:20:30 | 显示全部楼层
  素材在哪啊
发表于 2014-2-16 21:00:06 | 显示全部楼层
   楼主,点了animation后,建clip后 没出现material等子集
发表于 2014-8-4 11:39:05 | 显示全部楼层
学习了~加油 多出点东西
发表于 2014-10-19 09:38:56 | 显示全部楼层
支持                 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-13 22:22

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表