12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- Shader "Funly/Sky Studio/Utility/Animated Sprite Sheet"
- {
- Properties
- {
- [NoScaleOffset] _MainTex ("Sprite Texture", 2D) = "white" {}
- _SpriteColumnCount ("Sprite Columns", int) = 1
- _SpriteRowCount ("Sprite Rows", int) = 1
- _SpriteItemCount ("Sprite Total Items", int) = 1
- _AnimationSpeed ("Animation Speed", int) = 25
- _Intensity ("Intensity", Range(0, 1)) = .7
- }
- SubShader
- {
- Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
- LOD 100
- Blend OneMinusDstColor One
- Cull Off
- Pass
- {
- CGPROGRAM
- #pragma target 2.0
- #pragma vertex vert
- #pragma fragment frag
-
- #include "UnityCG.cginc"
- struct appdata
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- };
- struct v2f
- {
- float2 uv : TEXCOORD0;
- float4 vertex : SV_POSITION;
- };
- sampler2D _MainTex;
- int _SpriteColumnCount;
- int _SpriteRowCount;
- int _SpriteItemCount;
- int _AnimationSpeed;
- float _Intensity;
- int GetSpriteTargetIndex(int itemCount, int animationSpeed, float seed) {
- float spriteProgress = frac((_Time.y + (10.0f * seed)) / ((float)itemCount / (float)animationSpeed));
- return (int)(itemCount * spriteProgress);
- }
- float2 GetSpriteItemSize(float2 dimensions) {
- return float2(1.0f / dimensions.x, (1.0f / dimensions.x) * (dimensions.x / dimensions.y));
- }
- float2 GetSpriteSheetCoords(float2 uv, float2 dimensions, int targetFrameIndex, float2 itemSize, int numItems) {
- int rows = dimensions.y;
- int columns = dimensions.x;
- float2 scaledUV = float2(uv.x * itemSize.x, uv.y * itemSize.y);
- float2 offset = float2(
- targetFrameIndex % abs(columns) * itemSize.x,
- ((rows - 1) - (targetFrameIndex / abs(columns))) * itemSize.y);
- return scaledUV + offset;
- }
- float2 GetAnimatedSpriteCoords(float2 uv) {
- float2 dimensions = float2(_SpriteColumnCount, _SpriteRowCount);
- float2 itemSize = GetSpriteItemSize(dimensions);
- int spriteIndex = GetSpriteTargetIndex(_SpriteItemCount, _AnimationSpeed, 1.0f);
- return GetSpriteSheetCoords(uv, dimensions, spriteIndex, itemSize, _SpriteItemCount);
- }
- v2f vert (appdata v)
- {
- v2f o;
- o.vertex = UnityObjectToClipPos(v.vertex);
- o.uv = saturate(GetAnimatedSpriteCoords(v.uv));
- return o;
- }
-
- fixed4 frag (v2f i) : SV_Target
- {
- return tex2D(_MainTex, i.uv) * _Intensity;
- }
- ENDCG
- }
- }
- }
|