- Home /
Explode Mesh when clicked on
I'm looking for some help.
I want my GameObject to explode when it's clicked on.
I don't mean like a fiery explosion but one like this:
https://www.youtube.com/watch?v=38eEZyNfd3A
If there's a tutorial to do this or code (not looking for hand-outs but if you want to provide it, thank you) please let me know.
P.S. It doesn't matter if it's Javascript or C#.
@AlexTheHollow I just grabbed this script from your GitHub account, very nice, but I am getting about 1 FPS. Any ideas on how I can fix this?
Answer by Cherno · Aug 27, 2015 at 06:24 PM
Here is a script that makes an object explode into it's triangles.. Add the component to a gameobject and call the method with a bool parameter (controls if the objects should be destroyed):
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);
}
}
}
Thank you very much but I have no idea how to do that...
I'm very much a novice at coding and I don't fully understand everything.
Just add the script to a gameobject and add a Start function:
void Start() {
StartCoroutine(Split$$anonymous$$esh(true));
}
If you have problems with that, too, then you need to read throught the Unity beginner tutorials.
Your answer
![](https://koobas.hobune.stream/wayback/20220612001610im_/https://answers.unity.com/themes/thub/images/avi.jpg)