Posted April 09, 2024 by Slow Seer
#2D #Breakable #sprite #pixel #pot #vase
One of the most fun parts of any game is smashing anything and everything.
Here's how I came up with what I think is a satisfying smash visual as a non-artsy programmer.
Instantiating the pixels:
// Properties / Awake List<GameObject> _pixels = new (); SpriteRenderer _spriteRenderer = GetComponent<spriterenderer>();
// Function to build pixels (I called mine from Start) var spriteRect = _spriteRenderer.sprite.rect; var start = new Vector2Int( Mathf.FloorToInt(spriteRect.x), Mathf.FloorToInt(spriteRect.y)); var end = new Vector2Int( Mathf.CeilToInt(spriteRect.x + spriteRect.width), Mathf.CeilToInt(spriteRect.y + spriteRect.height)); // -0.5 To account for the pixel center pivot. // I chose not to edit the pivot on the pixel so // it could be reused in other things like particles. var spritePivot = spriteRect.position + _spriteRenderer.sprite.pivot + new Vector2(-0.5f, -0.5f); for (int x = start.x; x < end.x; x++) { for (int y = start.y; y < end.y; y++) { var pixelColor = _spriteRenderer.sprite.texture.GetPixel(x, y); // Skip non-visible pixels if (pixelColor.a == 0) { continue; } var spritePos = (new Vector2(x, y) - spritePivot) / _spriteRenderer.sprite.pixelsPerUnit; var pos = transform.position + (Vector3)spritePos; var pixelGameObject= Instantiate( _pixelPrefab, pos, _pixelPrefab.transform.rotation, parent: transform); pixelGameObject.GetComponent<SpriteRenderer>().color = pixelColor * _spriteRenderer.color; _pixels.Add(pixelGameObject); } }
Obviously this isn't a super efficient approach, but its better than making the art for each broken piece!