[Add] All in one shader

This commit is contained in:
2026-02-23 22:01:07 +07:00
parent ec0aa86ac2
commit 4f942cd7c0
806 changed files with 401510 additions and 33 deletions
@@ -0,0 +1,92 @@
using UnityEngine;
using UnityEngine.Rendering;
namespace AllIn1SpriteShader
{
[ExecuteInEditMode]
[RequireComponent(typeof(SpriteRenderer))]
public class SpritePropertiesSync : MonoBehaviour
{
public enum CastShadowMode
{
[InspectorName("Off")] OFF,
[InspectorName("One Sided")] ONE_SIDED,
[InspectorName("Two Sided")] TWO_SIDED
}
private static int PROPID_SPRITE_FLIP = Shader.PropertyToID("_SpriteFlip");
public SpriteRenderer spr;
public bool isMaterialDrivenByAnimator;
[SerializeField] private CastShadowMode shadowCastingMode = CastShadowMode.TWO_SIDED;
private MaterialPropertyBlock matPropBlock;
public void Start()
{
if(spr == null) spr = GetComponent<SpriteRenderer>();
if(spr == null)
{
Debug.LogWarning($"Sprite Renderer is null in SpritePropertiesSync-{gameObject.name}", gameObject);
enabled = false;
return;
}
matPropBlock = new MaterialPropertyBlock();
UpdateRendererShadowCastingMode();
}
private void LateUpdate()
{
if(spr == null || spr.sharedMaterial == null)
{
Debug.LogError($"Incorrect setup in SpritePropertiesSync-{gameObject.name}", gameObject);
enabled = false;
return;
}
#if UNITY_EDITOR
if (matPropBlock == null) matPropBlock = new MaterialPropertyBlock();
UpdateRendererShadowCastingMode();
#endif
UpdateMaterial();
}
private void UpdateRendererShadowCastingMode()
{
switch (shadowCastingMode)
{
case CastShadowMode.OFF:
spr.shadowCastingMode = ShadowCastingMode.Off;
break;
case CastShadowMode.ONE_SIDED:
spr.shadowCastingMode = ShadowCastingMode.On;
break;
case CastShadowMode.TWO_SIDED:
spr.shadowCastingMode = ShadowCastingMode.TwoSided;
break;
}
}
private void UpdateMaterial()
{
spr.GetPropertyBlock(matPropBlock);
float flipX = spr.flipX ? -1f : 1f;
float flipY = spr.flipY ? -1f : 1f;
Vector3 localScale = spr.transform.localScale;
float scaleSign = Mathf.Sign(localScale.x * localScale.y * localScale.z * flipX * flipY);
Vector4 vecFlip = new Vector4(flipX, flipY, flipX, flipY);
if (Application.isPlaying && isMaterialDrivenByAnimator)
{
vecFlip.x = 1.0f;
vecFlip.y = 1.0f;
}
vecFlip.z = scaleSign;
matPropBlock.SetVector(PROPID_SPRITE_FLIP, vecFlip);
spr.SetPropertyBlock(matPropBlock);
}
}
}