Skip to content

Instantly share code, notes, and snippets.

@mandarinx
Created March 20, 2017 08:33
Show Gist options
  • Save mandarinx/7fb49dd6bb4a298da8bbf1e2ef94c2f9 to your computer and use it in GitHub Desktop.
Save mandarinx/7fb49dd6bb4a298da8bbf1e2ef94c2f9 to your computer and use it in GitHub Desktop.
Explode sprites
IEnumerator slowExplodeCO(SpriteRenderer spriteRendrr, float duration=1, bool reuseSprite=true) {
if(spriteRendrr==null)
spriteRendrr=GetComponent<SpriteRenderer>();
sprite = spriteRendrr.sprite;
width=(int)sprite.textureRect.width;
height=(int)sprite.textureRect.height;
ox=(int)sprite.textureRect.position.x;
oy=(int)sprite.textureRect.position.y;
if(pixelScale==0) pixelScale=.0625f;
if(scale<1) scale=Random.Range (2,5);
psys = GetComponent<ParticleSystem>();
psys.gravityModifier = gravity;
Vector2 size = new Vector2(width/scale, height/scale);
Vector3 v3z = Vector3.zero;
Color c;
float psizeorig=pixelScale*scale;
List<chip> chips = new List<chip>();
psys.maxParticles = (int)(size.x*size.y);
float initRotation = spriteRendrr.transform.eulerAngles.z;
Texture2D chipTexture = new Texture2D((int)size.x,(int)size.y, sprite.texture.format, false);
chipTexture.filterMode = sprite.texture.filterMode;
float o = 1/(sprite.pixelsPerUnit*2f);
Vector2 offset = new Vector2(sprite.pivot.x/sprite.pixelsPerUnit-o, sprite.pivot.y/sprite.pixelsPerUnit-o) ;
for (int x = 0; x < size.x; x++)
for (int y = 0; y < size.y; y++)
{
c = sprite.texture.GetPixel (x*scale+ox, y*scale+oy);
chipTexture.SetPixel(x,y,c);
if(useSpriteColor) c*=spriteRendrr.color;
if(!c.Equals (Color.clear) && !c.Equals (Color.black))
{
Vector3 ppos = spriteRendrr.transform.TransformPoint(new Vector2((float)x*(float)scale*pixelScale - offset.x, (float)y*(float)scale*pixelScale - offset.y ));
float psize = psizeorig;
if(randomSize)
psize+=Random.value*pixelScale;
Vector3 pvel = explosionSpeed * new Vector2(Random.Range (-3f,3f), Random.Range (2f,5f)) + vel*Random.value;
ParticleSystem.EmitParams p = new ParticleSystem.EmitParams();
p.velocity = v3z;
p.position = ppos;
p.startSize = psize;
p.rotation = initRotation;
p.startLifetime = duration + Random.value * Random.value * aliveForSeconds;
if(colorMultiplier!=1) c *= colorMultiplier;
p.startColor = c;
chip cp = new chip();
cp.spritePosX = x;
cp.spritePosY = y;
cp.particleParams = p;
chips.Add(cp);
}
}
chipTexture.Apply();
Sprite newSprite = Sprite.Create(chipTexture, new Rect(0,0,width,height),
new Vector2(sprite.pivot.x/(float)width, sprite.pivot.y/(float)height),
sprite.pixelsPerUnit);
if(reuseSprite)
spriteRendrr.sprite = newSprite;
else {
GameObject spriteGO = new GameObject(sprite.name+"_xplode");
SpriteRenderer newSR = spriteGO.AddComponent<SpriteRenderer>();
newSR.transform.parent = transform;
newSR.transform.position = spriteRendrr.transform.position;
newSR.transform.rotation = spriteRendrr.transform.rotation;
newSR.sprite = newSprite;
newSR.sharedMaterial = spriteRendrr.sharedMaterial;
newSR.color = spriteRendrr.color;
}
chips.shuffle();
ParticleSystem.Particle[] particles=null;
float chp = 0;
float prechp = 0;
while(chp<=chips.Count){
chp += (Time.deltaTime * (float)chips.Count)/duration;
if(chp-prechp>=1) {
for(int p=Mathf.RoundToInt(prechp);p<Mathf.RoundToInt(Mathf.Clamp(chp,0,chips.Count));p++){
chipTexture.SetPixel(chips[p].spritePosX,chips[p].spritePosY,Color.clear);
psys.Emit(chips[p].particleParams,1);
}
prechp = chp;
chipTexture.Apply();
}
yield return new WaitForEndOfFrame();
}
yield return 0;
Destroy(spriteRendrr);
Destroy(gameObject, duration+aliveForSeconds+1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment