困扰已久的运行时粒子缩放问题:Unity3D研究院之运行时修改粒子特效镜像以及缩放

刚好这几天有朋友问我,我也刚好整理一下。

1.先说非运行时,AssetStore有一个叫Particle Scaler的插件,非常好用。但是很遗憾它运行时不能用。

2.再说运行时,就是让transform的scale可以控制粒子的缩放,如果设置-1就是粒子镜像。

首先,把unity的shader下载下来。http://unity3d.com/cn/get-unity/download/archive 找到所有Particle开头的shader,也就是粒子特效用的。

下面我随便改一个shader,其他的shader修改方法原理一样。 注:shader 中 ”//—Add—“ 就是我修改的内容

Shader "Particles/Additive" {
Properties {
	_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
	_MainTex ("Particle Texture", 2D) = "white" {}
	_InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0
	//----------------------add------------------------------
	_Position ("Position", Vector) = (0,0,0,0)
	_Scale ("Scale", Vector) = (1,1,1,1)
	//----------------------add------------------------------
	
}
 
Category {
	Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
	Blend SrcAlpha One
	AlphaTest Greater .01
	ColorMask RGB
	Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }
	
	SubShader {
		Pass {
		
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_particles
 
			#include "UnityCG.cginc"
 
			sampler2D _MainTex;
			fixed4 _TintColor;
			
			struct appdata_t {
				float4 vertex : POSITION;
				fixed4 color : COLOR;
				float2 texcoord : TEXCOORD0;
			};
 
			struct v2f {
				float4 vertex : SV_POSITION;
				fixed4 color : COLOR;
				float2 texcoord : TEXCOORD0;
				#ifdef SOFTPARTICLES_ON
				float4 projPos : TEXCOORD1;
				#endif
			};
			
			float4 _MainTex_ST;
			//----------------------add------------------------------
			float4 _Position;
			float4 _Scale;
			//----------------------add------------------------------
			v2f vert (appdata_t v)
			{
				v2f o;
				//----------------------add------------------------------
				float4 objV = mul(UNITY_MATRIX_MV, v.vertex);
				objV.xyz -= _Position;
				objV.xyz = float3(_Scale.x * objV.x, _Scale.y * objV.y, _Scale.z * objV.z);
				objV.xyz += _Position;
				o.vertex = mul(UNITY_MATRIX_P, objV);
				//----------------------add------------------------------
				//o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				
				#ifdef SOFTPARTICLES_ON
				o.projPos = ComputeScreenPos (o.vertex);
				COMPUTE_EYEDEPTH(o.projPos.z);
				#endif
				o.color = v.color;
				o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
				return o;
			}
 
			sampler2D_float _CameraDepthTexture;
			float _InvFade;
 
			fixed4 frag (v2f i) : SV_Target
			{
				#ifdef SOFTPARTICLES_ON
				float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));
				float partZ = i.projPos.z;
				float fade = saturate (_InvFade * (sceneZ-partZ));
				i.color.a *= fade;
				#endif
				
				return 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);
			}
			ENDCG 
		}
	}	
}
}


接着给需要缩放或者镜像的粒子挂上这一条脚本。利用OnWillRenderObject方法,将粒子的缩放以及坐标传进shader中去。
using UnityEngine;
using System.Collections;
 
public class ParticleScaler : MonoBehaviour {
	void OnWillRenderObject(){
		renderer.material.SetVector("_Position",Camera.current.worldToCameraMatrix.MultiplyPoint(transform.root.position));
		renderer.material.SetVector("_Scale",transform.lossyScale);
	}
}

OK.这样粒子就完成了镜像。。 编辑器中快改一改transform的scale的值看看效果吧。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值