public static GenerateVoronoiPieces ( GameObject source, int extraPoints, int subshatterSteps, Material mat = null ) : List |
||
source | GameObject | |
extraPoints | int | |
subshatterSteps | int | |
mat | Material | |
return | List |
/// <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; } } }
/// <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); } } }
/// <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); } } }
/// <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> 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); }
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); }