The jonki

呼ばれて飛び出てじょじょじょじょーんき

【Unity】Particle System (Shuriken)で回転シェーダーアニメーション

Particle SystemsにはParticle Rendererというものがあり、MeshのParticle Systemを作ることが可能です。すぎっちょさんののシェーダーの蝶々に感動してひとまず実験。

パーティクルをアニメーションさせる方法, sugi.cho creation


シェーダーも詳しくないので少しずつ実験していく予定です。ということで初回は各パーティクルを回転させてみました。画像だとよくわからないのでぜひWeb Playerで今回作ったものをお試しください。

シェーダーのコード

今回作成したシェーダーです。Unityでシェーダーを書くのが初めての人は、以前書いた Unityのシェーダで2Dのリング(円)を描く などをご参考くださいまし。
texcoordはテクスチャのuv座標なので、中心に移動させてから回転行列をかけ、それを元の場所に戻します。またフラグメントシェーダーではclipを使って描画していないところがあります。これをコメントアウトするとテクスチャがループして表示されているように見えます。ぜひコメントアウトして確かめましょう。

Shader "Custom/SimpleRot" {
	Properties {
		_MainTex ("Particle Texture", 2D) = "white" {}
	}
	
	SubShader {
		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
		
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha 
	
		Pass {
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
				
			#include "UnityCG.cginc"
			#define PI 3.14159265359
			
			sampler2D _MainTex;
		
			struct v2f {
				float4 pos : POSITION;
				fixed4 col : COLOR;
				float2 uv : TEXCOORD0;
			};
			
			v2f vert (appdata_base v)
			{
				float _RotationSpeed = 2.0;
				float sinX = sin ( _RotationSpeed * _Time.z );
				float cosX = cos ( _RotationSpeed * _Time.z );
				float sinY = sin ( _RotationSpeed * _Time.z );
				float2x2 rotationMatrix = float2x2( cosX, -sinX, sinY, cosX);
				v.texcoord.xy -= 0.5;
				v.texcoord.xy = mul ( v.texcoord.xy, rotationMatrix );
				v.texcoord.xy += 0.5;
				
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = float2(v.texcoord.x, v.texcoord.y);
				return o;
			}
			
			half4 frag (v2f i) : COLOR
			{
				half4 col = tex2D(_MainTex, i.uv);
				if(i.uv.x < 0.0) clip(-1.0);
				if(i.uv.x > 1.0) clip(-1.0);
				if(i.uv.y < 0.0) clip(-1.0);
				if(i.uv.y > 1.0) clip(-1.0);
				
				return col;
			}
			ENDCG
		}
	}
}

Particle Systemの設定

Particle SystemのRendererをMeshにして好きな形状とそのテクスチャを選びましょう。とりあえず最初なのでPlaneと透過の結晶テクスチャにしました。シェーダーには作成した自分のカスタムシェーダーを指定します。

ソースコード

githubに上げてあります。prefabも作ってあるのでどうぞご自由に。
https://github.com/jojonki/unity/blob/master/effects/Assets/Shaders/SimpleRot.shader

次に向けて

今度はvertexを直接いじって有機的に動くメッシュを作ります。