Created
March 20, 2017 08:33
-
-
Save mandarinx/7fb49dd6bb4a298da8bbf1e2ef94c2f9 to your computer and use it in GitHub Desktop.
Explode sprites
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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