2014-09-15 16:36:11 jiangyongyuan 阅读数 126

Unity3D学习笔记——组件之Effects(效果/特效)——Particle System(粒子系统) - 有情怀的人

Effects: 效果/特效。

Particle System: 粒子系统。可用于创建烟雾、气流、火焰、涟漪等效果。

在Unity3D 3.5版本之后退出了新的shuriken粒子系统: 

 

添加组件之后的效果: 

   

其中的Open Editor按钮可以打开粒子编辑器,用于编辑复杂的粒子效果。

由于shuriken粒子系统是模块化的管理方式,所以可以动态的添加模块:

1.初始化模块:此模块是效果组件固有的模块。

Duration:粒子发射器,发射粒子的时间。单位为S(秒)。

Looping:是否开启。如果开启了循环,Duration值只要大于最小值0.10即可。

Prewarm:是否开启预热。只有在开启的循环的时候,预热才有效果,粒子量相似发射了一个粒子周期。

Start Delay:预热延迟。游戏开始多长时间后,预热开启。单位为S。 

Start Lifetime:粒子从发射器出来,到消失的时间。单位为S。 

Start Speed:粒子发射的速度。

Start Size:粒子大小。

Start Rotation:粒子的旋转角度。

Start Color:粒子的颜色。

Gravity Multiplier:设置重力对粒子的影响,数值越大影响越大。

Inherit Velocity:速度继承。当粒子系统是运动的时候,粒子的速度会继承运动的速度。但粒子坐标系必须在世界坐标系。 

Simulation Space:坐标系是本身还是世界坐标系。

Play On Awake:在游戏开始播放,但不影响Start Delay效果。

Max Particles:粒子释放的最大数量,当达到最大数量时,停止释放粒子,当有粒子消失时继续释放。

2.Emission Module(粒子发射模块)用于粒子发射的速率。或是某个特定时间发射大量的粒子,用于模拟爆炸的效果。

每秒发射粒子数量。Bursts为某个时间点爆发出粒子的数量,这个时间必须在粒子Duration范围内。

每米发射粒子数量。粒子发射器所在的游戏对象,移动的时候每米发射的粒子,但粒子坐标系必须在世界坐标系。

3.Shape Model(形状控制模块):定义了粒子发射器的形状,位置及发射方向。

球形粒子发射器:

Radius:球形的半径。

Emit from Shell:是否从表面发射粒子,还是从内部发射。

Random Direction:是否启用随机速度。

半球发射器:

锥体发射器:

Angle:椎体,上边开口的大小。

Radius:半径的大小。 

Length:椎体的高度。只有当Emit from 值为Volume Shell或是Volume时可用。

Emit From:粒子发射的位置。

——————Base:粒子发射源在椎体的内部的底面上,由底面开始发射。

——————Base Shell:粒子发射源在椎体底面的边缘,就是周长那一圈发射。

——————Volume:粒子发射源在椎体内部空间。

——————Volume Shell:粒子发射器在椎体整个表面上。没有底面。

立方体发射器:

Box X:立方体长度。

网格发射器:

Mesh:选择网格样式。

——————Vertex:粒子将从网格顶点发射。

——————Edge:粒子将从网格边缘(棱)发射。

——————Triangle:粒子将从网格的三角面发射。图形都是三角形组成的。

4.生命周期速度模块:控制每一个粒子的速度。

5.生命周期速度限制模块:

Separate Axis:是否启用限制每一个轴。

Speed:限制的速度。

Dampen:阻尼。阻尼为1的时候表示在生命周期结束的时候,速度降到限定的速度。

6.生命周期作用力模块:控制每一个粒子在生命周期内受到力的情况。

Randomize: 只有在 Random Between Two Constants或Random Between Two Curves时才可启用。

表示每一帧作用在粒子上的力是均匀随机产生的。 

7.生命周期颜色模块:控制每一个粒子在生命周期内颜色的变化。

8:速度范围颜色变化控制模块:根据设置速度的范围和粒子的速度来改变粒子的颜色。

9:生命周期粒子大小模块:控制每个粒子在生命周期内,大小的变化。

10: 速度范围粒子大小变化控制模块:根据速度的变化改变粒子的大小。

 

11:生命周期每个粒子的旋转速度:每秒粒子旋转的角度。

12:根据速度变化改变粒子的旋转速度:旋转速度不为固定常数时。

13:外部作用力倍增数:调整风对粒子的影响情况。

14:碰撞模块:为粒子创建粒子碰撞效果,目前只支持平面碰撞。

平面碰撞只支持6个平面,点击+号可以添加现在有的平面或是新建立一个。

通过新建立了碰撞平面,会成为粒子物体的子物体。

  Visualization:碰撞平面的显示方式。

——————Grid:  

——————Solid: 

Scale Plane:碰撞平面的大小。

Dampen:阻尼系数。粒子速度撞击损耗程度。0~1。

Bounce:反弹系数。0~2.系数越大,反弹角度越小。

Min kill Speed:最小销毁速度。当速度小于这个值的时候,粒子消失。

Particle Radius:粒子碰撞半径。最小值为0.01。

世界碰撞:

Collides With:碰撞层级。选择与那一层级碰撞。

Collision Quality:碰撞质量。

——————High: 每个粒子会每帧与场景做一次射线碰撞检测,需要注意的是,这样会增加CPU的负担,故在此情况下整个场景中的粒子数应当小于1000。

——————Medium: 粒子系统在每帧会受到一次Parude Raycast Budget全局设定的影晌。

——————Low: 与 中等效果相似 ,只 是粒子系统每4帧才受一次Parude Raycast Budget全局参数的影晌。

 —————— Voxel Size:碰撞缓存中的体素的尺寸,仅当Collision Quality为Medium和Low时可用。

15:子粒子发射模块:在粒子出生,碰撞,消灭时可以调用其他粒子。

   

  

  16:序列帧动画纹理模块:

Tiles:x水平分割的份数,y垂直分割的份数。

Animation:Whole Sheet-整个页面即X,Y一起移动。

Frame over Time:生命周期内,动画变幻的速率。

Cycles:生命周期内变化几次动画。

Animation:Single Row-从左到右行滚动。

Random Row:随机行。

Row:选择某一行,开始滚动,小于Tiles中的Y。

17:粒子的渲染模块:

Render Mode:渲染模式。

——————Billboard:面板渲染。

——————Vertical Billboard垂直渲染,此模式当面对摄像机时,粒子将与zX平面对齐

——————Horizontal Billboard :水平模式,此模式下粒子将沿Y轴对齐。

——————Stretched Billboard:拉伸渲染。

————C ameraScale:相机缩放。摄像机的速度对于粒子伸缩影晌的程度。speed Scale:通过比较粒子的速度决定粒子的长度。 LengthScale:通过比较粒子的宽度决定粒子的长度。

——————Mesh:模式。

18:属性:

Resimulate:实时渲染。在改变参数的时候,场景中的粒子效果实时变化。

Wireframe:选择时,将显示粒子的片面网格。

Trail Renderer

Line Renderer

Lens Flare

Halo

Projector

Legacy Particles

2014-04-20 22:32:23 qinyuanpei 阅读数 11796

       大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei

       相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场景,当玩家操控我们的游戏角色——机器人时,当机器人靠近游戏场景中的门时,门会自动打开,而当机器人离开门时,门会自动关闭。那么,我们今天就来一起实现这样一个简单的功能。通过题目大家一定知道了这个功能的实现是基于Trigger的。Trigger在Unity3D中称为触发器,当一个碰撞器勾选了isTrigger选项后,即变成了触发器。触发器和碰撞器的区别在于碰撞器通过OnCollisionEnter/Stay/Exit()三个方法进行响应且会对参与到碰撞中的物体产生力的作用。而触发器则通过OnTriggerEnter/Stay/Exit()三个方法来响应且不会对参与到触发的物体产生力的作用。关于触发器和碰撞器的内容,大家可以参考这篇文章:http://game.ceeger.com/Components/class-BoxCollider.html

       好了,下面请大家跟随我一起来学习如何在Unity3D中实现基于Trigger的触发式动画,首先我们创建如下的场景:


        场景中的地面和墙体、门均有Cube构成,这里我们把地面、墙体的盒子碰撞器全部移除,避免它们对我们的程序产生干扰。首先我们编写两段脚本来控制门从左向右移动、从右向左移动的动画:

	//开门动画
	private void OpenDoorAni()
        {
	  if(transform.position.x<=1.8F)
	  {
		transform.Translate(Vector3.right * Time.deltaTime * 1.5F);
	  }
        }
	//关门动画
	private void CloseDoorAni()
	{
	  //等待5秒后再关门,避免角色与门发生碰撞
	  StartCoroutine("Wait");
	  if(transform.position.x>=0)
	  {
		transform.Translate(Vector3.left * Time.deltaTime * 1.5F);
	  }
	}
	

         代码基本上很容易理解,就是分别从左向右、从右向左移动门啦!接下来,我们给我们的角色加上一个球体碰撞器并勾选isTrigger选项,为什么选择球体碰撞器呢,因为这样角色进入触发和退出触发的时候,都是和门的盒子碰撞器相切的。在关门的时候延迟两秒是为了给玩家一个控制角色的反应时间,避免和门发生碰撞。这里要注意的是角色是带刚体的。

         好了,接下来我们编写触发这一块的代码:

	
	void OnTriggerEnter(Collider mCollider)
	{
	  Debug.Log(mCollider.gameObject.tag);
	  if(mCollider.gameObject.tag=="Player")
	  {
	    Triggered=true;
	  }
	}
	
	void OnTriggerExit(Collider mCollider)
	{
	  if(mCollider.gameObject.tag=="Player")
	  {
	    Triggered=false;
	  }
	}
	
       我们在这里是通过改变一个bool型的标志变量来标记角色是否引起了触发,当引起了触发的时候执行开门的动画,退出除了触发的时候执行关门的动画。这一部分我们放在Update()方法里:

	
	void Update () 
	{
	  if(Triggered)
	  {
	    OpenDoorAni();
	  }else if(!Triggered)
	  {
		CloseDoorAni();
	  }
	}

      最后给出全部代码:

using UnityEngine;
using System.Collections;

public class AniScripts : MonoBehaviour {
	
    //定义门的移动速度
	public float mSpeed=1.5F;
	//定义门的标志变量
	private bool Triggered=false;
	
	void Update () 
	{
	  if(Triggered)
	  {
	    OpenDoorAni();
	  }else if(!Triggered)
	  {
		CloseDoorAni();
	  }
	}
	
	//开门动画
	private void OpenDoorAni()
    {
	  if(transform.position.x<=1.8F)
	  {
		transform.Translate(Vector3.right * Time.deltaTime * 1.5F);
	  }
    }
	//关门动画
	private void CloseDoorAni()
	{
	  //等待5秒后再关门,避免角色与门发生碰撞
	  StartCoroutine("Wait");
	  if(transform.position.x>=0)
	  {
		transform.Translate(Vector3.left * Time.deltaTime * 1.5F);
	  }
	}
	
	void OnTriggerEnter(Collider mCollider)
	{
	  Debug.Log(mCollider.gameObject.tag);
	  if(mCollider.gameObject.tag=="Player")
	  {
	    Triggered=true;
	  }
	}
	
	void OnTriggerExit(Collider mCollider)
	{
	  if(mCollider.gameObject.tag=="Player")
	  {
	    Triggered=false;
	  }
	}
	
	
	IEnumerator Wait()
	{
		//等待5秒在执行
		yield return new WaitForSeconds(5);
	}
	
	
}

        一起来看看效果演示吧:


         喜欢我的博客请记住我的名字:秦元培,我的博客地址是:blog.csdn.net/qinyuanpei
         转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24198893


     

2019-08-15 15:31:00 weixin_41862321 阅读数 191

准备工作首先创建工程,通过Assets->Import Package->Effects导入标准资源库中的特效素材,如下图所示。如果安装Unity时没有安装标准资源库,可以到这里单独下载并安装。

导入资源后,Project中将出现下图中的结构:
在这里插入图片描述

接下来就可以在场景中加入必要的元素了。应用Projector组件
将BlobShadowProjector(Standard Shader Gallery -> Effects -> Projectors -> Prefabs)拖入场景中,Inspector面板如图:
在这里插入图片描述
BlobShadowProjector实现的是通过Projector组件在物体上投射一个圆形的阴影。将上图中Cookie改成我们需要的图片(注意图片属性中Alpha from Grayscale需要勾选,Wrap mode选择Clamp,当然你可以尝试不同选择看实际效果),但仍然存在不少问题,如png图片中的透明部分会被渲染成黑色,场景中有不明条纹等。
Projector的原理是为其frustum范围内的物体增加一个Pass,将我们在Projector中定义的材质渲染出来。为了解决上面所说的问题,我们可以创建自己的Shader和材质。
首先,复制Standard Shader Gallery -> Effects -> Projectors -> ProjectorMultiply,另存为ProjectorCustom,修改如下:

Shader “Projector/Custom” {
Properties{
_ShadowTex(“Cookie”, 2D) = “gray” {}
_FalloffTex(“FallOff”, 2D) = “white” {}
}
Subshader{
Tags{ “Queue” = “Transparent” }
Pass{
ZWrite Off
ColorMask RGB
//Blend DstColor Zero
Blend SrcAlpha OneMinusSrcAlpha
Offset -1, -1

    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag
    #pragma multi_compile_fog
    #include "UnityCG.cginc"

    struct v2f {
        float4 uvShadow : TEXCOORD0;
        float4 uvFalloff : TEXCOORD1;
        UNITY_FOG_COORDS(2)
        float4 pos : SV_POSITION;
    };

    float4x4 _Projector;
    float4x4 _ProjectorClip;

    v2f vert(float4 vertex : POSITION)
    {
        v2f o;
        o.pos = mul(UNITY_MATRIX_MVP, vertex);
        o.uvShadow = mul(_Projector, vertex);
        o.uvFalloff = mul(_ProjectorClip, vertex);
        UNITY_TRANSFER_FOG(o,o.pos);
        return o;
    }

    sampler2D _ShadowTex;
    sampler2D _FalloffTex;

    fixed4 frag(v2f i) : SV_Target
    {
        fixed4 texS = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));
        //texS.a = 1.0-texS.a;

        //fixed4 texF = tex2Dproj(_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff));
        //lerp(fixed4(1, 1, 1, 0), texS, texF.a);
        fixed4 res = texS;

        UNITY_APPLY_FOG_COLOR(i.fogCoord, res, fixed4(1,1,1,1));
        return res;
    }
        ENDCG
    }
}

}

注释的部分为修改之前的代码
新建一个材质并将Shader选择为Projector/Custom,勾选图片的Alpha is Transparent,将新材质作为Projector组件的Material,并勾选Projector组件的Orthographic复选框,得到如下效果:
在这里插入图片描述

此时,投影器使用完成,新建一个gameobject,添加videoplayer,添加videoclip,新建renderTexture,
修改videoplayer的rendermode,targetTexture选择刚刚新建的rendertexture,然后把投影器的材质球贴图换成rendertexture
大功告成。
在这里插入图片描述
注:可以通过修改rendertexture的size来调整清晰度。

在这里插入图片描述

文章参考了 https://blog.csdn.net/winchyy/article/details/51564489大神的思路,结合自己的研究,达到了自己想要的效果。

在这里插入图片描述

2016-03-30 15:42:05 wuyt2008 阅读数 3931

这个盒子的素材在playmaker的官网上有下载

http://www.hutonggames.com/downloads/01_00_S1_Assets_WPG.zip


开始和上一课一样

把盒子拖到场景,添加状态,事件,按钮动作



这个时候,如果把播放动画的动作添加到按钮事件,会出现下面的情况,运行后,盒子自己打开了,但是状态停在关闭的时候,按钮点击没反应。



这个时候,需要添加新的状态,让动画播放的状态。



完了之后,在动画播放的状态添加FINISHED过渡,这个过渡是系统给的。



把按钮上的播放动画的动作删除,重新连接箭头



播放的状态如下设置



运行预览,这是开始状态



点击按钮以后,播放打开盒子动画的状态



盒子打开完成的状态


2016-07-16 23:25:57 daimou123 阅读数 1965

Unity制作颜色渐变的倒计时

项目需要制作颜色渐变的倒计时,挺简单的代码,大体思路就是开一个协程,在协程里面控制颜色的变化以及进度条的进度,话不多说代码奉上

public void ShowSliderWithId(int time)
{
    GameObject sl = (GameObject)Instantiate (_sliderPrefab);
    sl.transform.parent = transform;  //设置父节点
    sl.transform.localScale = new Vector3 (1f,1f,1f);
    sl.transform.localPosition = new Vector3 (0f,0f,0f);
    sl.GetComponent<UISlider> ().value = 1f;
    StartCoroutine (ScheduleUpdateGlobal (sl,time));
}

IEnumerator ScheduleUpdateGlobal(GameObject obj,int time)
{
    float seconds = 0;//倒计时时间
    UISlider slider  = obj.GetComponent<UISlider> ();
    UISprite sprite = obj.GetComponent<UISprite> ();
    while(true)  
    {  
        for (float timer = 0; timer < 1; timer += Time.deltaTime) {//控制时间1秒走完
            seconds += Time.deltaTime;  
            slider.value = (1-seconds / time);
            if (seconds > time / 2) { //时间到达一半开始我这里要求是时间过去一半颜色开始变化
                float g = ((time - seconds) * 2 / time);
                sprite.color = new Color (1, g, 1, 1);//控制g渐变为红色
            }
            yield return 0; 
        }
        if (seconds >= time) {
            GameObject.Destroy (obj);
            break; //跳出死循环
        }
    }
}

我用的是环形进度条,我的ui用的是NGUI,需要在Inspector面板中UISprite里面的type选择filled,fillDir选择redial360;
附上我用的进度条

没有更多推荐了,返回首页