/// <summary> /// Turns Gameobject into multiple fragments /// </summary> private void generateFragments() { fragments = new List <GameObject>(); switch (shatterType) { case ShatterType.Triangle: fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps); break; case ShatterType.Voronoi: fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps); break; default: Debug.Log("invalid choice"); break; } //sets additional aspects of the fragments foreach (GameObject p in fragments) { if (p != null) { p.layer = LayerMask.NameToLayer(fragmentLayer); p.GetComponent <Renderer>().sortingLayerName = sortingLayerName; p.GetComponent <Renderer>().sortingOrder = orderInLayer; } } }
public void Break(MonoBehaviour upon) { SpriteExploder.Explode(this); AfterBreak(upon); Destroy(gameObject); }
/// <summary> /// Turns Gameobject into multiple fragments /// </summary> private void generateFragments() { ClearCollider(); fragments = new List <GameObject>(); switch (shatterType) { case ShatterType.Triangle: fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps); break; case ShatterType.Voronoi: fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps); break; default: Debug.Log("invalid choice"); break; } SetCollider(); //sets additional aspects of the fragments foreach (GameObject p in fragments) { if (p != null) { p.layer = LayerMask.NameToLayer(fragmentLayer); p.GetComponent <Renderer>().sortingLayerName = sortingLayerName; p.GetComponent <Renderer>().sortingOrder = orderInLayer; MeshCollider meshCol = p.AddComponent <MeshCollider>(); meshCol.skinWidth = ChildrenColliderWidth; Rigidbody rb = p.AddComponent <Rigidbody>(); rb.mass = UnityEngine.Random.Range(MassPerFragment.minValue, MassPerFragment.maxValue); rb.useGravity = UseGravityOnFragments; rb.drag = UnityEngine.Random.Range(DragPerFragment.minValue, DragPerFragment.maxValue); rb.angularDrag = UnityEngine.Random.Range(AngularDragPerFragment.minValue, AngularDragPerFragment.maxValue); rb.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY; meshCol.sharedMesh = p.GetComponent <MeshFilter>().sharedMesh; meshCol.sharedMesh.RecalculateBounds(); meshCol.sharedMesh.RecalculateNormals(); meshCol.sharedMesh.RecalculateTangents(); meshCol.convex = true; if (DestroyPiecesAfterHit) { p.AddComponent <DestroyAfter>().Time = UnityEngine.Random.Range(DestroyAfterTime.minValue, DestroyAfterTime.maxValue); } } } foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>()) { if (addon.enabled) { addon.OnFragmentsGenerated(fragments); } } }
void Awake() { if(instance == null) { instance = this; } else Destroy(gameObject); }
/// <summary> /// Turns Gameobject into multiple fragments /// </summary> private void generateFragments(bool meshSaved = false) { fragments = new List <GameObject>(); switch (shatterType) { case ShatterType.Triangle: fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps, null, meshSaved); break; case ShatterType.Voronoi: fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps, null, meshSaved); break; default: Debug.Log("invalid choice"); break; } for (int i = 0; i < fragments.Count; i++) { if (fragments[i] != null) { fragments[i].layer = LayerMask.NameToLayer(fragmentLayer); fragments[i].GetComponent <Renderer>().sortingLayerName = sortingLayerName; fragments[i].GetComponent <Renderer>().sortingOrder = orderInLayer; fragments[i].GetComponent <Rigidbody2D>().gravityScale = 0; /// prefab mesh save if (meshSaved) { if (!string.IsNullOrEmpty("Assets/Mesh")) { Directory.CreateDirectory("Assets/Mesh"); } var mesh = fragments[i].GetComponent <MeshFilter>().sharedMesh; #if UNITY_EDITOR AssetDatabase.CreateAsset(mesh, "Assets/Mesh/" + transform.name + "_" + i + ".asset"); #endif } } } #if UNITY_EDITOR AssetDatabase.SaveAssets(); #endif foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>()) { if (addon.enabled) { addon.OnFragmentsGenerated(fragments); } } }
private void GenerateSquare() { MeshFilter meshFilter = GetComponent <MeshFilter>(); Mesh mesh = meshFilter.sharedMesh; if (mesh == null) { meshFilter.mesh = new Mesh(); mesh = meshFilter.sharedMesh; } var vertices = new Vector3[4]; var halfWidth = width / 2; var halfHeight = height / 2; vertices[0] = new Vector3(-halfWidth, -halfHeight, 0); vertices[1] = new Vector3(halfWidth, -halfHeight, 0); vertices[2] = new Vector3(-halfWidth, halfHeight, 0); vertices[3] = new Vector3(halfWidth, halfHeight, 0); mesh.vertices = vertices; var tri = new int[6]; tri[0] = 0; tri[1] = 2; tri[2] = 1; tri[3] = 2; tri[4] = 3; tri[5] = 1; mesh.triangles = tri; SpriteExploder.calcNormals(gameObject); var uv = new Vector2[4]; uv[0] = new Vector2(0, 0); uv[1] = new Vector2(textureScaleU, 0); uv[2] = new Vector2(0, textureScaleV); uv[3] = new Vector2(textureScaleU, textureScaleV); mesh.uv = uv; }
/// <summary> /// Turns Gameobject into multiple fragments /// </summary> public void generateFragments() { fragments = new List <GameObject>(); switch (shatterType) { case ShatterType.Triangle: fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps); break; case ShatterType.Voronoi: fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps); break; default: Debug.Log("invalid choice"); break; } //sets additional aspects of the fragments foreach (GameObject p in fragments) { if (p != null) { p.layer = LayerMask.NameToLayer(fragmentLayer); p.AddComponent <fadeParticles>(); p.GetComponent <Renderer>().sortingLayerName = sortingLayerName; p.GetComponent <Renderer>().sortingOrder = orderInLayer; p.GetComponent <Rigidbody2D>().gravityScale = 0; p.AddComponent <keepMoving>(); // km = p.GetComponent<keepMoving>(); // kms.Add(km); // km.create(p.GetComponent<Rigidbody2D>()); // p.AddComponent<SelfDestruct>(); // p.GetComponent<SelfDestruct>().lifeSpan = 2f; } } foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>()) { if (addon.enabled) { addon.OnFragmentsGenerated(fragments); } } }
/// <summary> /// Turns Gameobject into multiple fragments /// </summary> private void generateFragments() { fragments = new List <GameObject>(); switch (shatterType) { case ShatterType.Triangle: fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps); break; case ShatterType.Voronoi: fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps); break; default: Debug.Log("invalid choice"); break; } //sets additional aspects of the fragments foreach (GameObject p in fragments) { if (p != null) { p.transform.parent = transform.parent; p.layer = LayerMask.NameToLayer(fragmentLayer); p.GetComponent <Renderer>().sortingLayerName = "Destructible Platform"; p.GetComponent <Renderer>().sortingOrder = orderInLayer; p.transform.gameObject.tag = sortingTag; p.GetComponent <Rigidbody2D> ().bodyType = RigidbodyType2D.Kinematic; p.AddComponent <ExplodeOnClick> (); } } foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>()) { if (addon.enabled) { addon.OnFragmentsGenerated(fragments); } } }
/// <summary> /// Turns Gameobject into multiple fragments /// </summary> public void generateFragments() { fragments = new List <GameObject>(); switch (shatterType) { case ShatterType.Triangle: fragments = SpriteExploder.GenerateTriangularPieces(gameObject, extraPoints, subshatterSteps); break; case ShatterType.Voronoi: fragments = SpriteExploder.GenerateVoronoiPieces(gameObject, extraPoints, subshatterSteps); break; default: //Debug.Log("invalid choice"); break; } //sets additional aspects of the fragments foreach (GameObject p in fragments) { if (p != null) { p.layer = LayerMask.NameToLayer("Fragments"); p.GetComponent <Renderer>().sortingLayerName = sortingLayerName; p.GetComponent <Renderer>().sortingOrder = orderInLayer; p.AddComponent <FragmentDestoryer>(); } } foreach (ExplodableAddon addon in GetComponents <ExplodableAddon>()) { if (addon.enabled) { addon.OnFragmentsGenerated(fragments); } } }
private void generateFragments() { fragments = new List <GameObject>(); switch (shatterType) { case ShatterType.Triangle: fragments = SpriteExploder.GenerateTriangularPieces(base.gameObject, extraPoints, subshatterSteps); break; case ShatterType.Voronoi: fragments = SpriteExploder.GenerateVoronoiPieces(base.gameObject, extraPoints, subshatterSteps); break; default: UnityEngine.Debug.Log("invalid choice"); break; } foreach (GameObject fragment in fragments) { if (fragment != null) { fragment.layer = LayerMask.NameToLayer(fragmentLayer); fragment.GetComponent <Renderer>().sortingLayerName = sortingLayerName; fragment.GetComponent <Renderer>().sortingOrder = orderInLayer; fragment.tag = "pig"; } } ExplodableAddon[] components = GetComponents <ExplodableAddon>(); foreach (ExplodableAddon explodableAddon in components) { if (explodableAddon.enabled) { explodableAddon.OnFragmentsGenerated(fragments); } } }
public static List <GameObject> GenerateTriangularPieces(GameObject source, int extraPoints = 0, int subshatterSteps = 0, Material mat = null) { List <GameObject> pieces = new List <GameObject>(); if (mat == null) { mat = createFragmentMaterial(source); } //get transform information Vector3 origScale = source.transform.localScale; source.transform.localScale = Vector3.one; Quaternion origRotation = source.transform.localRotation; source.transform.localRotation = Quaternion.identity; //get rigidbody information Rigidbody2D rg = source.GetComponent <Rigidbody2D>(); //Я добавил Vector2 origVelocity = rg.velocity; //get collider information PolygonCollider2D sourcePolyCollider = source.GetComponent <PolygonCollider2D>(); BoxCollider2D sourceBoxCollider = source.GetComponent <BoxCollider2D>(); List <Vector2> points = new List <Vector2>(); List <Vector2> borderPoints = new List <Vector2>(); //add points from the present collider if (sourcePolyCollider != null) { points = getPoints(sourcePolyCollider); borderPoints = getPoints(sourcePolyCollider); } else if (sourceBoxCollider != null) { points = getPoints(sourceBoxCollider); borderPoints = getPoints(sourceBoxCollider); } //create a bounding rectangle based on the polygon points Rect rect = getRect(source); //if the target polygon is a triangle, generate a point in the middle to allow for fracture if (points.Count == 3) { points.Add((points[0] + points[1] + points[2]) / 3); } for (int i = 0; i < extraPoints; i++) { points.Add(new Vector2(Random.Range(rect.width / -2, rect.width / 2), Random.Range(rect.height / -2, rect.height / 2))); } Voronoi voronoi = new Delaunay.Voronoi(points, null, rect); List <List <Vector2> > clippedTriangles = new List <List <Vector2> >(); foreach (Triangle tri in voronoi.Triangles()) { clippedTriangles = ClipperHelper.clip(borderPoints, tri); foreach (List <Vector2> triangle in clippedTriangles) { pieces.Add(generateTriangularPiece(source, triangle, origVelocity, origScale, origRotation, mat, rg)); } } List <GameObject> morePieces = new List <GameObject>(); if (subshatterSteps > 0) { subshatterSteps--; foreach (GameObject piece in pieces) { morePieces.AddRange(SpriteExploder.GenerateTriangularPieces(piece, extraPoints, subshatterSteps, mat)); GameObject.DestroyImmediate(piece); } } else { morePieces = pieces; } //reset transform information source.transform.localScale = origScale; source.transform.localRotation = origRotation; Resources.UnloadUnusedAssets(); return(morePieces); }
public static List <GameObject> GenerateVoronoiPieces(GameObject source, int extraPoints = 0, int subshatterSteps = 0, Material mat = null) { List <GameObject> pieces = new List <GameObject>(); if (mat == null) { mat = createFragmentMaterial(source); } //get transform information Vector3 origScale = source.transform.localScale; source.transform.localScale = Vector3.one; Quaternion origRotation = source.transform.localRotation; source.transform.localRotation = Quaternion.identity; //get rigidbody information Rigidbody2D rigbody = source.GetComponent <Rigidbody2D>(); //Я добавил Vector2 origVelocity = rigbody.velocity; //get collider information PolygonCollider2D sourcePolyCollider = source.GetComponent <PolygonCollider2D>(); BoxCollider2D sourceBoxCollider = source.GetComponent <BoxCollider2D>(); List <Vector2> points = new List <Vector2>(); List <Vector2> borderPoints = new List <Vector2>(); if (sourcePolyCollider != null) { points = getPoints(sourcePolyCollider); borderPoints = getPoints(sourcePolyCollider); } else if (sourceBoxCollider != null) { points = getPoints(sourceBoxCollider); borderPoints = getPoints(sourceBoxCollider); } Rect rect = getRect(source); for (int i = 0; i < extraPoints; i++) { points.Add(new Vector2(Random.Range(rect.width / -2, rect.width / 2), Random.Range(rect.height / -2, rect.height / 2))); } Voronoi voronoi = new Delaunay.Voronoi(points, null, rect); List <List <Vector2> > clippedRegions = new List <List <Vector2> >(); foreach (List <Vector2> region in voronoi.Regions()) { clippedRegions = ClipperHelper.clip(borderPoints, region); foreach (List <Vector2> clippedRegion in clippedRegions) { pieces.Add(generateVoronoiPiece(source, clippedRegion, origVelocity, origScale, origRotation, mat, rigbody)); } } List <GameObject> morePieces = new List <GameObject>(); if (subshatterSteps > 0) { subshatterSteps--; foreach (GameObject piece in pieces) { morePieces.AddRange(SpriteExploder.GenerateVoronoiPieces(piece, extraPoints, subshatterSteps)); GameObject.DestroyImmediate(piece); } } else { morePieces = pieces; } //reset transform information source.transform.localScale = origScale; source.transform.localRotation = origRotation; Resources.UnloadUnusedAssets(); return(morePieces); }
void Awake() { spriteExploderScript = GameObject.FindGameObjectWithTag ("SpriteExploder").GetComponent<SpriteExploder> (); }
public static List <GameObject> GenerateCavePieces(GameObject source, PointsResult pointsResult, int subshatterSteps = 0, Material mat = null) { List <GameObject> pieces = new List <GameObject> (); if (mat == null) { mat = createFragmentMaterial(source); } //get transform information Vector3 origScale = source.transform.localScale; source.transform.localScale = Vector3.one; Quaternion origRotation = source.transform.localRotation; source.transform.localRotation = Quaternion.identity; //get rigidbody information Vector2 origVelocity = source.GetComponent <Rigidbody2D> ().velocity; Rect rect = getRect(source); List <Vector2> points = new List <Vector2> (); foreach (Point point in pointsResult.points) { points.Add(point.point); } List <Vector2> borderPoints = pointsResult.borderPoints; Voronoi voronoi = new Delaunay.Voronoi(points, null, rect); List <List <Vector2> > clippedRegions = new List <List <Vector2> > (); foreach (Point point in pointsResult.points) { bool isWall = pointsResult.isWall(point); float magnitude = point.point.magnitude; bool isCell = magnitude > 100; bool isInStartingArea = Mathf.Abs(Mathf.Abs(point.point.x) - Mathf.Abs(point.point.y)) < 10; if (!isInStartingArea && (isWall || isCell)) { List <Vector2> region = voronoi.Region(point.point); clippedRegions = ClipperHelper.clip(borderPoints, region); foreach (List <Vector2> clippedRegion in clippedRegions) { pieces.Add(generateVoronoiPiece(source, clippedRegion, origVelocity, origScale, origRotation, mat)); } } } List <GameObject> morePieces = new List <GameObject> (); if (subshatterSteps > 0) { subshatterSteps--; foreach (GameObject piece in pieces) { morePieces.AddRange(SpriteExploder.GenerateVoronoiPieces(piece, 3, subshatterSteps)); GameObject.DestroyImmediate(piece); } } else { morePieces = pieces; } //reset transform information source.transform.localScale = origScale; source.transform.localRotation = origRotation; Resources.UnloadUnusedAssets(); return(morePieces); }
void OnCollisionEnter(Collision collision) { SpriteExploder spriteExploder = GetComponent <SpriteExploder>(); spriteExploder.Explode(); }
public override void OnInspectorGUI() { SpriteExploder spriteExploder = (SpriteExploder)target; spriteExploder.PixelPrefab = (GameObject)EditorGUILayout.ObjectField("Pixel Prefab", spriteExploder.PixelPrefab, typeof(GameObject), true); EditorGUILayout.BeginVertical(); string genText = ""; string genButtonText = ""; if (spriteExploder.HasGeneratedSprite && spriteExploder.transform.Find("ExplosionPixels") != null) { genText = "You have generated your explosion pixels."; genButtonText = "Regenerate Pixels"; } else { genText = "Press the button below to generate the explosion pixels."; genButtonText = "Generate Pixels"; } if (spriteExploder.PixelPrefab == null) { genText = "Please assign a pixel prefab to generate the explosion pixels."; } EditorGUILayout.LabelField(genText); if (spriteExploder.PixelPrefab != null) { if (GUILayout.Button(genButtonText)) { spriteExploder.GenerateSprite(); } } EditorGUILayout.EndVertical(); if (spriteExploder.HasGeneratedSprite && spriteExploder.transform.Find("ExplosionPixels") != null) { spriteExploder.ExplodeFromCenter = EditorGUILayout.Toggle("Explode From Center", spriteExploder.ExplodeFromCenter); spriteExploder.ExplodeOnClick = EditorGUILayout.Toggle("Explode On Click", spriteExploder.ExplodeOnClick); spriteExploder.ExplodeOnCollision = EditorGUILayout.Toggle("Explode On Collision", spriteExploder.ExplodeOnCollision); if (spriteExploder.ExplodeOnCollision) { spriteExploder.MinimumExplosionVelocity = EditorGUILayout.FloatField("Minimum Explosion Velocity", spriteExploder.MinimumExplosionVelocity); } spriteExploder.ExplosionForce = EditorGUILayout.FloatField("Explosion Force", spriteExploder.ExplosionForce); if (spriteExploder.ExplosionForce < 0) { spriteExploder.ExplosionForce = 0; } spriteExploder.ExplosionRandomness = EditorGUILayout.Slider("Explosion Randomness", spriteExploder.ExplosionRandomness, 0, spriteExploder.ExplosionForce); if (spriteExploder.ExplosionRandomness < 0) { spriteExploder.ExplosionRandomness = 0; } if (spriteExploder.ExplosionRandomness > spriteExploder.ExplosionForce) { spriteExploder.ExplosionRandomness = spriteExploder.ExplosionForce; } spriteExploder.PixelLifespan = EditorGUILayout.FloatField("Pixel Lifespan", spriteExploder.PixelLifespan); if (spriteExploder.PixelLifespan < 0) { spriteExploder.PixelLifespan = 0; } spriteExploder.PixelLifespanRandomness = EditorGUILayout.Slider("Pixel Lifespan Randomness", spriteExploder.PixelLifespanRandomness, 0, spriteExploder.PixelLifespan); if (spriteExploder.PixelLifespanRandomness < 0) { spriteExploder.PixelLifespanRandomness = 0; } if (spriteExploder.PixelLifespanRandomness > spriteExploder.PixelLifespan) { spriteExploder.PixelLifespanRandomness = spriteExploder.PixelLifespan; } } if (GUI.changed) { EditorUtility.SetDirty(target); if (!Application.isPlaying) { UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty(); } } }