Skip to content

Instantly share code, notes, and snippets.

@j3ffgray
Created July 15, 2016 16:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save j3ffgray/9550eab7430706d86d92c2d962124ddf to your computer and use it in GitHub Desktop.
Save j3ffgray/9550eab7430706d86d92c2d962124ddf to your computer and use it in GitHub Desktop.
Exploding a Mesh into a bunch of triangles with Rigidbodies. (from http://answers.unity3d.com/questions/1006318/script-to-break-mesh-into-smaller-pieces.html)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TriangleExplosion : MonoBehaviour {
public IEnumerator SplitMesh (bool destroy) {
if(GetComponent<MeshFilter>() == null || GetComponent<SkinnedMeshRenderer>() == null) {
yield return null;
}
if(GetComponent<Collider>()) {
GetComponent<Collider>().enabled = false;
}
Mesh M = new Mesh();
if(GetComponent<MeshFilter>()) {
M = GetComponent<MeshFilter>().mesh;
}
else if(GetComponent<SkinnedMeshRenderer>()) {
M = GetComponent<SkinnedMeshRenderer>().sharedMesh;
}
Material[] materials = new Material[0];
if(GetComponent<MeshRenderer>()) {
materials = GetComponent<MeshRenderer>().materials;
}
else if(GetComponent<SkinnedMeshRenderer>()) {
materials = GetComponent<SkinnedMeshRenderer>().materials;
}
Vector3[] verts = M.vertices;
Vector3[] normals = M.normals;
Vector2[] uvs = M.uv;
for (int submesh = 0; submesh < M.subMeshCount; submesh++) {
int[] indices = M.GetTriangles(submesh);
for (int i = 0; i < indices.Length; i += 3) {
Vector3[] newVerts = new Vector3[3];
Vector3[] newNormals = new Vector3[3];
Vector2[] newUvs = new Vector2[3];
for (int n = 0; n < 3; n++) {
int index = indices[i + n];
newVerts[n] = verts[index];
newUvs[n] = uvs[index];
newNormals[n] = normals[index];
}
Mesh mesh = new Mesh();
mesh.vertices = newVerts;
mesh.normals = newNormals;
mesh.uv = newUvs;
mesh.triangles = new int[] { 0, 1, 2, 2, 1, 0 };
GameObject GO = new GameObject("Triangle " + (i / 3));
GO.layer = LayerMask.NameToLayer("Particle");
GO.transform.position = transform.position;
GO.transform.rotation = transform.rotation;
GO.AddComponent<MeshRenderer>().material = materials[submesh];
GO.AddComponent<MeshFilter>().mesh = mesh;
GO.AddComponent<BoxCollider>();
Vector3 explosionPos = new Vector3(transform.position.x + Random.Range(-0.5f, 0.5f), transform.position.y + Random.Range(0f, 0.5f), transform.position.z + Random.Range(-0.5f, 0.5f));
GO.AddComponent<Rigidbody>().AddExplosionForce(Random.Range(300,500), explosionPos, 5);
Destroy(GO, 5 + Random.Range(0.0f, 5.0f));
}
}
GetComponent<Renderer>().enabled = false;
yield return new WaitForSeconds(1.0f);
if(destroy == true) {
Destroy(gameObject);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment