09 特效系统

  

  粒子系统
粒子组件:在Unity中制做粒子特效是经过ParticleSystem组件来实现的,能够在Hierarchy中右键直接建立,也能够经过建立一个空物体,为空物体添加ParticleSystem组件来实现。shell

粒子系统属性dom

(1)Duration:整个粒子系统的持续时间
(2)Looping:是否开启循环,开启后循环播放粒子效果
(3)Prewarm:是否看开启预热,只有在开启循环以后才能够勾选此选项
(4)Start Delay:预热延迟。勾选预热后不能勾选该选项
(5)Start Lifetime:粒子生命周期,一个粒子从出现到消失的时间
(6)Start Speed:粒子出现时的发射速度
(7)3D Start Size:可在XYZ轴上更改粒子的大小
(8)Start Size:粒子大小,直接更改
(9)Start Rotation:粒子出现时的旋转角度
(10)Randomize Roation:粒子在运动过程当中的旋转角度
(11)StartColor;粒子颜色(有多种颜色模式,渐变...)
(12)GravityModifier:粒子是否受重力影响,值为零的时候不受重力
(预设值为0,表明粒子沒受到重粒影响,因此会一直往上飘,当数值增长,粒子就会往下掉。)
(13)SimulationSpace:粒子坐标系(自身坐标,世界坐标,自定义)
(14)SimulationSpeed:速度继承,粒子速度继承运动的速度
(15)ScalingMode:缩放比例
(16)PlayOnAwake:勾选后游戏开始后播放
(17)MaxParticle:粒子释放的最大数量
(假设设定为100,当场景里的粒子数量达到100上限时,发射器就会暂时中止发射射粒子,等部分粒子消失才会继续发射。)
(18)AutoRandomSeed:自动随机出现粒子ide

                            粒子的发射模块oop

 

RateoverTime:发射时间
RateoverTime:发射距离
Bursts:爆炸效果动画

                        粒子系统的形状模块spa

 

Shape:形状(球型,半球形,锥形,立方体,网格,圆形,刀锋形)
Angle:椎体角度
Radius:椎体半径
Length:椎体高度(当Emitform值为volumeshell或volume时可用)
Emitform:粒子发射的位置
Randomize(Spherize) Direction:发射方向是否随机插件

                    粒子在整个生命周期中的速度3d

 

Space:坐标模式(世界坐标,自身坐标)code

                    Limit Velocity over Lifetime :速度限制模块
orm

 

Separate Axes :分离轴

Speed : 速度限制

Dampen :阻尼,当速度超出速度限制的时候,会下降速度

Curve:曲线;
Random Between Two Constants:在两个常量直接随机
Random Between Two Curves :在两条曲线直接随机

                 速度继承

Mode:initial:继承速度,Current:当前速度

Force over Lifetime :x,y,z,在x,y,z轴施加力的限制

Space : 参考坐标系

Randomize:只有在Random Between Two Constants 或者Random Between Two Curves时才可启用
            在粒子的生命周期中颜色的变化

         速度变化颜色发生的变化

Color :颜色值

Gradient:渐变

Random Between Two Gradients:在两个渐变的颜色中随机

Random Between Two Gradients :在两个渐变的颜色中随机
                   Size over Lifetime:在生命周期内控制粒子的尺寸


Curve:曲线

Random Between Two Constants:在两个常数之间随机

Random BeTween Two Curves :在两个曲线之间随机

Size by Speed :经过控制速度来控制粒子的尺寸


size:尺寸

Curve:曲线
Random Between Two Constants:在两个常数之间随机
Random BeTween Two Curves :在两个曲线之间随机
                      粒子在生命周期中的旋转角度

经过速度控制粒子的旋转角度

External Forces:外部力对粒子系统影响模块

Noise:噪音

Separate Axes :单独的轴

Strength:强度

Frequency:频率

Scroll speed:滚动速度

Damping:阻尼

Octaves:振幅

Octaves Multiplier:增长振幅

Quality :质量

Remap:从新映射

Remap Curve:从新映射曲线
                      粒子系统的碰撞模块

Planes:平面碰撞(碰撞类型:planes,world:世界坐标碰撞)平面碰撞最多支持六个
Visualization:碰撞平面的显示方式
ScalePlane:平面的缩放比例
Dampen:阻尼系数
Bounce:反弹系数
LifetimeLoss:在生命周期内碰撞丢失几率系数
MinKillSpeed:粒子系统碰撞销毁的最小速度
MaxKillSpeed:粒子系统碰撞销毁的最大速度
RadiusScale:粒子的半径
SendCollisionMessage:是否发送碰撞信息

实现碰撞的方法
void OnParticleCollision (GameObject other) {
            Rigidbody body = other.GetComponent.<Rigidbody>();
            if (body) {

             Vector3 direction = other.transform.position - transform.position;
             direction = direction.normalized;
             body.AddForce (direction * 5);

} }

粒子系统的触发模块Triggers

colliders:粒子触发的物体
Inside:粒子触发内部
outside:粒子触发外部
Enter:开始触发
Exit:触发结束
RadiusScale:触发的半径
VisualizeBounds:想象范围
               离子系统发射器:Sub Emitters

Brith:粒子刚生成的时候调用的子发射器
Collision:粒子碰撞的时候调用的子发射器
Death:粒子销毁时调用的子发射器
             粒子系统贴图动画

Tiles:分割数 X:水平方向分割 ;Y:竖直方向分割
Animation:WholeSheet:所有图片参与帧动画
SingleRow:单行图片参与帧动画
FraneoverTime:在生命周期内帧动画变化的速度
Cycles:在粒子生命周期内,帧动画循环的次数
               粒子系统的渲染模块

RenderMode:BillBoard:面板渲染
StretchedBillBorard:拉伸渲染
HorizontalBillBorard:水平渲染
VerticalBillBorard:垂直渲染
MeshBillBorard:网格渲染
NormalDirection:法线方向
Material:材质
SortMode:排序模式
Min/Max Particle Size:最小/最大的粒子尺寸
CustomShadows:是否开启投影
ReceiveShadows:接受投影
SortingLayer:排序层级
Order in layer:在层中的顺序
Resimulate:从新开始发射粒子
线性渲染
线性渲染使用到线性渲染组件(LineRenderer),该组件实在两个或更多个点之间绘制出一条直线,一个线性渲染器组件能够绘制任何线,从一个简单的直线到复杂的螺旋线。若是要绘制两条或更多条的线,须要建立更多的游戏物体,每个游戏物体都挂载线性渲染组件。
                    线性渲染组件(LineRenderer)

Cast Shadows:投射阴影
Receive Shadows:是否接受阴影
Motion Vectors:运动矢量(仅摄像机移动,游戏物体移动,无运动)
Materials:画线材质,能够为绘制出的线段添加材质,每个材质都会对画线渲染一次
Positions:绘制线段的位置点,最少两个,即在哪两个点之间绘制线
Use World Space:使用世界坐标
Loop:勾选后会使绘制的线段造成一个闭合的图案
Width:绘制线段的宽度,能够经过曲线控制随着绘制的线段的长度的变化宽度随之变化,使得绘制出的线更具备多样性。
Color:画线颜色,能够设置为渐变色。
Corner Vertices:数值越大,画线的拐角处约圆滑
End Cap Vertices:同上,数值越大,画线的两端越圆滑
Alignment:画线校准(View 以摄像机为基准校准 Local 以自身为基准校准)
Texture Mode:图片填充方式(拉伸,平铺...)
Light Probes:照明模式
LineRenderer经常使用属性:
SetColor:设置颜色
SetPosition:设置点的位置
positionCount:设置顶点数目
SetStartWidth:设置起始宽度
SetEndWidth:设置结束宽度
拖尾渲染
拖尾渲染时使用拖尾渲染组件(Trail Renderer),来渲染出游戏物体的移动轨迹的一种渲染模式
要让那个物体产生拖尾效果就在哪个物体上挂载TrailRenderer组件
组件具体属性同画线渲染差很少
拖尾渲染也会根据Assert Store当中的插件MeleeWeapon Trail来制做刀光拖尾效果
       MeleeWeapon Trail插件

Material:表示刀光拖尾效果材质球
LiftTime:表示刀光拖尾的持续时间
Base:表示刀光的起始位置
Tip:表示刀光的结尾位置
在要拖尾渲染的物体下建立两个空的子物体,分别取名tip与base。分别用来表示刀光拖尾的结尾端与开端。将tip移动到武器的尾端,将base移动到武器的柄端
贴图融合
把两张图片融合成一张图片的效果。
实例:弹痕效果
原理:实现两张图片的融合,即将其中一张图片的的像素点放到另一张图片上。
一、须要两张图片,一张墙壁的图片,一张弹痕的图片,要实现用鼠标点击墙壁图片时,以点击的位置为中心点,将弹痕图片的像素点设置在墙壁图片

二、建立Unity工程,这两张图片拖到工程后,作如下修改设置
①须要设置这两张图片的TextureType为Advanced;
②这两张图片都要勾选上Read/WriteEnable属性,容许图片进行像素编辑;
③设置弹痕图片的MaxSize为64,Format格式为:RGBA32 bit;
④设置wall图片的MaxSize为2048,Format格式为RGBA32 bit;
三、建立场景,直接将墙壁图片托放在Plane上便可
在游戏场景中建立一个plane,将处理过的墙面图片拖上去
四、建立脚本PlaneScr,在脚本中实现使用鼠标点击墙壁时可以生成相应的弹痕,将脚本挂载在Plane上

//得到强和子弹的纹理
    public Texture2D bulletTexture;
    public Texture2D wallTexture;

    //定义一个墙面副本
    Texture2D newWallTexture;

    //记录墙面和子弹的宽高
    float wall_height;
    float wall_width;
    float bullet_height;
    float bullet_width;

    //射线碰撞信息
    RaycastHit hitInfo;
    //定义一个泛型队列来存放图像像素点信息
    Queue <Vector2> uvQueue;

在Start方法中为字段初始化
void Start ()
    {
        uvQueue = new Queue<Vector2> ();
        //获取墙的贴图
        wallTexture = GetComponent<MeshRenderer> ().material.mainTexture as Texture2D;
        //备份用做墙面的复原
        newWallTexture = Instantiate (wallTexture);
        //将备份的图片赋值给plane
        GetComponent<MeshRenderer> ().material.mainTexture = newWallTexture;
        //得到墙面和子弹的初始宽高
        wall_height = newWallTexture.height;
        wall_width = newWallTexture.width;
        bullet_height = bulletTexture.height;
        bullet_width = bulletTexture.width;
    }

在Update方法中写贴图融合的效果,鼠标点击墙面发射射线,以射线碰撞    
的点为中心,将弹孔图片的像素点替换到墙面上
void Update ()
    {
        //鼠标点击        
        if (Input.GetMouseButtonDown (0)) {
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
            if (Physics.Raycast (ray, out hitInfo)) {
                if (hitInfo.collider.name == "Plane") {
                    Vector2 uv = hitInfo.textureCoord;
                    uvQueue.Enqueue (uv);
                    //说明子弹击中了墙面
                    //开始将墙壁上点击点为中心,弹孔图片大小的区域的像素点改为弹孔的像素点
                    //遍历子弹图片区域,取出子弹图片上的像素点
                    for (int i = 0; i < bullet_width; i++) {
                        for (int j = 0; j < bullet_height; j++) {
                            //获得墙壁上对应子弹应该出现的每个像素点
                            float w = uv.x * wall_width - bullet_width / 2 + i;
                            float h = uv.y * wall_height - bullet_height / 2 + j;
                            //获取墙面和子弹每个像素点的颜色
                            Color wallColor = newWallTexture.GetPixel ((int)w, (int)h);
                            Color bulletColor = bulletTexture.GetPixel (i, j);
                            //融合
                            newWallTexture.SetPixel ((int)w, (int)h, wallColor * bulletColor);
                        }
                    }
                    //将修改后的融合图片应用一下
                    newWallTexture.Apply ();
                    //延迟3秒后
                    Invoke ("ReturnWall", 3f);
                }
            }
        }

恢复墙面(即让弹孔消失的方法)
//恢复墙面
    void ReturnWall ()
    {
        //第一个弹孔的出队列
        Vector2 uv = uvQueue.Dequeue ();
        for (int i = 0; i < bullet_width; i++) {
            for (int j = 0; j < bullet_height; j++) {
                float w = uv.x * wall_width - bullet_width / 2 + i;
                float h = uv.y * wall_height - bullet_height / 2 + j;
                //获取原墙上的像素点
                Color wallColor = wallTexture.GetPixel ((int)w, (int)h);
                newWallTexture.SetPixel ((int)w, (int)h, wallColor);
            }
        }
        newWallTexture.Apply ();
    }