fix multiple issues

This commit is contained in:
2026-05-27 07:07:03 +02:00
parent 93a2f0e08c
commit 432dd57d07
12 changed files with 680 additions and 36 deletions
+54 -1
View File
@@ -9,16 +9,29 @@ public class CannonAreaEffect : MonoBehaviour
int damagePerSecond;
float slowMultiplier = 1f;
float expiresAt;
SpriteRenderer visual;
public void Configure(float effectDuration, int burnDamagePerSecond, float craterSlowMultiplier)
public void Configure(float effectDuration, int burnDamagePerSecond, float craterSlowMultiplier, float radius)
{
duration = effectDuration;
damagePerSecond = burnDamagePerSecond;
slowMultiplier = Mathf.Clamp(craterSlowMultiplier, 0.1f, 1f);
expiresAt = Time.time + duration;
CreateVisual(radius);
Destroy(gameObject, duration);
}
void Update()
{
if (visual == null || duration <= 0f)
return;
float remaining = Mathf.Clamp01((expiresAt - Time.time) / duration);
Color color = visual.color;
color.a = Mathf.Lerp(0f, color.a, remaining);
visual.color = color;
}
void OnTriggerStay2D(Collider2D other)
{
if (!other.CompareTag("Enemy"))
@@ -44,4 +57,44 @@ public class CannonAreaEffect : MonoBehaviour
health.TakeDamage(Mathf.Max(1, damagePerSecond));
nextDamageTick[health] = Time.time + 1f;
}
void CreateVisual(float radius)
{
GameObject visualObject = new GameObject("Visual", typeof(SpriteRenderer));
visualObject.transform.SetParent(transform, false);
visualObject.transform.localScale = Vector3.one * radius * 2f;
visual = visualObject.GetComponent<SpriteRenderer>();
visual.sprite = CreateCircleSprite();
visual.sortingOrder = -1;
if (damagePerSecond > 0 && slowMultiplier < 1f)
visual.color = new Color(0.95f, 0.33f, 0.12f, 0.34f);
else if (damagePerSecond > 0)
visual.color = new Color(1f, 0.32f, 0.08f, 0.34f);
else
visual.color = new Color(0.34f, 0.24f, 0.16f, 0.38f);
}
static Sprite CreateCircleSprite()
{
const int size = 64;
Texture2D texture = new Texture2D(size, size, TextureFormat.RGBA32, false);
texture.filterMode = FilterMode.Bilinear;
Vector2 center = new Vector2((size - 1) * 0.5f, (size - 1) * 0.5f);
float radius = size * 0.46f;
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
float distance = Vector2.Distance(new Vector2(x, y), center);
float alpha = Mathf.Clamp01((radius - distance) / 5f);
texture.SetPixel(x, y, new Color(1f, 1f, 1f, alpha));
}
}
texture.Apply();
return Sprite.Create(texture, new Rect(0f, 0f, size, size), new Vector2(0.5f, 0.5f), size);
}
}