GenerateVoronoiPieces() public static method

public static GenerateVoronoiPieces ( GameObject source, int extraPoints, int subshatterSteps, Material mat = null ) : List
source GameObject
extraPoints int
subshatterSteps int
mat Material
return List
コード例 #1
0
    /// <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;
            }
        }
    }
コード例 #2
0
    /// <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);
            }
        }
    }
コード例 #3
0
    /// <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);
            }
        }
    }
コード例 #4
0
    /// <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);
            }
        }
    }
コード例 #5
0
    /// <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);
            }
        }
    }
コード例 #6
0
    /// <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);
            }
        }
    }
コード例 #7
0
    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);
            }
        }
    }
コード例 #8
0
    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);
    }
コード例 #9
0
    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);
    }