Particle SystemsにはParticle Rendererというものがあり、MeshのParticle Systemを作ることが可能です。すぎっちょさんののシェーダーの蝶々に感動してひとまず実験。
パーティクルをアニメーションさせる方法, sugi.cho creation
シェーダーも詳しくないので少しずつ実験していく予定です。ということで初回は各パーティクルを回転させてみました。画像だとよくわからないのでぜひWeb Playerで今回作ったものをお試しください。
Web Playerで試す
https://dl.dropboxusercontent.com/u/9949353/unity/Rotate%20Particle/Rotate%20Particle.html
シェーダーのコード
今回作成したシェーダーです。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を直接いじって有機的に動くメッシュを作ります。