コード例 #1
0
 void Start()
 {
     if (originalSize == 0)
     {
         originalSize = Polygon2D.CreateFromCollider(gameObject).ToWorldSpace(transform).GetArea();
     }
 }
コード例 #2
0
    void Start()
    {
        bool addEvents = false;

        foreach (Collider2D collider in anchorColliders)
        {
            addEvents = true;
        }

        if (addEvents == false)
        {
            return;
        }

        Slicer2D slicer = GetComponent <Slicer2D> ();

        if (slicer != null)
        {
            slicer.AddResultEvent(OnSliceResult);
            slicer.AddEvent(OnSlice);
        }

        foreach (Collider2D collider in anchorColliders)
        {
            polygons.Add(Polygon2D.CreateFromCollider(collider.gameObject));
            colliders.Add(collider);
        }
    }
コード例 #3
0
    private void ExplodeAll()
    {
        List <Slice2D> results = Slicer2D.ExplodeAll(sliceLayer);

        if (addForce == true)
        {
            foreach (Slice2D id in results)
            {
                foreach (GameObject gameObject in id.gameObjects)
                {
                    Rigidbody2D rigidBody2D = gameObject.GetComponent <Rigidbody2D> ();
                    if (rigidBody2D)
                    {
                        float sliceRotation = Vector2D.Atan2(new Vector2D(0, 0), new Vector2D(gameObject.transform.position));
                        Rect  rect          = Polygon2D.CreateFromCollider(gameObject).GetBounds();
                        Physics2DHelper.AddForceAtPosition(rigidBody2D, new Vector2(Mathf.Cos(sliceRotation) * addForceAmount / 10f, Mathf.Sin(sliceRotation) * addForceAmount / 10f), rect.center);
                    }
                }
                if (sliceResultEvent != null)
                {
                    sliceResultEvent(id);
                }
            }
        }
    }
コード例 #4
0
    void Start()
    {
        if (GetComponents <Mesh2D>().Length > 1)
        {
            Slicer2D.Debug.LogError("Multiple 'Mesh2D' components cannot be attached to the same game object");
            return;
        }

        if (GetComponent <Slicer2D>() != null)
        {
            Slicer2D.Debug.LogError("'Mesh2D' and Slicer2D components cannot be attached to the same game object");
            return;
        }

        // Generate Mesh from collider
        Polygon2D polygon = Polygon2D.CreateFromCollider(gameObject);

        if (polygon != null)
        {
            polygon.CreateMesh(gameObject, Vector2.zero, Vector2.zero, triangulation);

            // Setting Mesh material
            if (material != null)
            {
                MeshRenderer meshRenderer = GetComponent <MeshRenderer> ();
                meshRenderer.material = material;

                meshRenderer.sortingLayerName = sortingLayerName;
                meshRenderer.sortingLayerID   = sortingLayerID;
                meshRenderer.sortingOrder     = sortingOrder;
            }
        }
    }
コード例 #5
0
    // Polygon Scatter Particles Effect
    void ExplodePolygon(GameObject CutObject)
    {
        Slicer2D.explosionPieces = 5;
        Slice2D explosionResult = CutObject.GetComponent <Slicer2D>().Explode();

        float z = 0f;

        foreach (GameObject b in explosionResult.gameObjects)
        {
            z -= 0.01f;

            Slicer2D slicer = b.GetComponent <Slicer2D>();
            slicer.Initialize();
            Destroy(slicer);

            b.AddComponent <DestroyTimer>();

            Rigidbody2D rigidBody2D = b.AddComponent <Rigidbody2D>();

            b.transform.Translate(0, 0, 1 + z);

            if (rigidBody2D)
            {
                Rect  rect          = Polygon2D.CreateFromCollider(b).GetBounds();
                float sliceRotation = Vector2D.Atan2(new Vector2D(rect.center), new Vector2D(b.transform.position));
                Physics2DHelper.AddForceAtPosition(rigidBody2D, new Vector2(Mathf.Cos(sliceRotation) * 351f, Mathf.Sin(sliceRotation) * 351f), rect.center);
            }
        }
    }
コード例 #6
0
    private void Explode(Vector2 position)
    {
        if (fixedJoint != null)
        {
            Destroy(fixedJoint);
        }

        transform.SetParent(null);
        List <Slice2D> results = Slicer2D.ExplodeAll(BreakableManager.Instance.Slice2DLayer);

        if (addedExplosionForceOnBreak > 0)
        {
            foreach (Slice2D id in results)
            {
                foreach (GameObject gameObject in id.gameObjects)
                {
                    var joint = gameObject.GetComponent <FixedJoint2D>();
                    if (joint != null)
                    {
                        Destroy(joint);
                    }
                    Rigidbody2D rigidBody2D = gameObject.GetComponent <Rigidbody2D>();
                    if (rigidBody2D)
                    {
                        float sliceRotation = Vector2D.Atan2(new Vector2D(position),
                                                             new Vector2D(gameObject.transform.position));
                        Rect rect = Polygon2D.CreateFromCollider(gameObject).GetBounds();
                        Physics2DHelper.AddForceAtPosition(rigidBody2D, new Vector2(Mathf.Cos(sliceRotation) *
                                                                                    addedExplosionForceOnBreak, Mathf.Sin(sliceRotation) * addedExplosionForceOnBreak), rect.center);
                    }
                }
            }
        }
    }
コード例 #7
0
 public Polygon2D GetPolygon()
 {
     if (polygon == null)
     {
         polygon = Polygon2D.CreateFromCollider(gameObject);
     }
     return(polygon);
 }
コード例 #8
0
 void Start()
 {
     foreach (Slicer2D slicer in  Slicer2D.GetList())
     {
         startingArea += Polygon2D.CreateFromCollider(slicer.gameObject).ToWorldSpace(slicer.transform).GetArea();
     }
     instance = this;
 }
コード例 #9
0
 public Polygon2D GetEdges()
 {
     if (edges == null)
     {
         edges = Polygon2D.CreateFromCollider(gameObject);
     }
     return(edges);
 }
コード例 #10
0
    public void Start()
    {
        poly = Polygon2D.CreateFromCollider(gameObject);

        if (GetComponent <EdgeCollider2D>() != null)
        {
            connectedLine = false;
        }
    }
コード例 #11
0
    // Recalculate area that is left
    public void UpdateText()
    {
        leftArea = 0;
        foreach (Slicer2D slicer in Slicer2D.GetList())
        {
            Polygon2D poly = Polygon2D.CreateFromCollider(slicer.gameObject);

            leftArea += poly.ToWorldSpace(slicer.gameObject.transform).GetArea();
        }

        leftArea  = ((leftArea) / startingArea) * 100f;
        text.text = "Left: " + (int)leftArea + "%";
    }
コード例 #12
0
    bool SliceIntesectEdges(List <Vector2D> slice)
    {
        foreach (ThinSliceEdge edge in ThinSliceEdge.GetList())
        {
            Polygon2D edgePolygon = Polygon2D.CreateFromCollider(edge.gameObject);
            if (Math2D.SliceIntersectSlice(slice, edgePolygon.ToWorldSpace(edge.transform).pointsList))
            {
                return(true);
            }
        }

        return(false);
    }
コード例 #13
0
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            float     timer = Time.realtimeSinceStartup;
            Polygon2D poly  = Polygon2D.CreateFromCollider(gameObject).ToWorldSpace(transform);

            Slicer2D.ComplexSliceAll(poly.pointsList, Slice2DLayer.Create());

            Destroy(gameObject);

            Slicer2D.Debug.Log(name + " in " + (Time.realtimeSinceStartup - timer) * 1000 + "ms");
        }
    }
コード例 #14
0
    public void Start()
    {
        polygon = Polygon2D.CreateFromCollider(gameObject);

        Shader shaderAdditive = Shader.Find("Particles/Additive");
        Shader shaderMultiply = Shader.Find("Particles/Multiply");

        materialAdditive             = new Material(shaderAdditive);
        materialAdditive.color       = Color.white;
        materialAdditive.mainTexture = Resources.Load("Textures/Bevel") as Texture;

        materialMultiply             = new Material(shaderMultiply);
        materialMultiply.color       = Color.white;
        materialMultiply.mainTexture = Resources.Load("Textures/Bevel") as Texture;
    }
コード例 #15
0
    // After Slice - Get smallest polygon which does not have balls in it
    GameObject GetCutGameObject(Slice2D sliceResult)
    {
        float      area      = 1e+10f;
        GameObject CutObject = null;

        foreach (GameObject resultObject in sliceResult.gameObjects)
        {
            Polygon2D poly = Polygon2D.CreateFromCollider(resultObject);
            if (poly.GetArea() < area && PolygonHasBallsInside(poly.ToWorldSpace(resultObject.transform)) == false)
            {
                CutObject = resultObject;
                area      = poly.GetArea();
            }
        }
        return(CutObject);
    }
コード例 #16
0
    public static void SpriteToMesh(GameObject gameObject, VirtualSpriteRenderer spriteRenderer, PolygonTriangulator2D.Triangulation triangulation = PolygonTriangulator2D.Triangulation.Advanced)
    {
        Texture2D texture = null;
        Sprite    sprite  = null;

        if (spriteRenderer.sprite != null)
        {
            sprite  = spriteRenderer.sprite;
            texture = sprite.texture;
        }

        float spriteSheetU = (float)(texture.width) / sprite.rect.width;
        float spriteSheetV = (float)(texture.height) / sprite.rect.height;

        Rect rect   = sprite.rect;
        Rect uvRect = new Rect((float)rect.x / texture.width, (float)rect.y / texture.height, (float)rect.width / texture.width, (float)rect.height / texture.height);

        Vector2 scale = new Vector2(spriteSheetU * rect.width / sprite.pixelsPerUnit, spriteSheetV * rect.height / spriteRenderer.sprite.pixelsPerUnit);

        float pivotX = sprite.pivot.x / sprite.rect.width - 0.5f;
        float pivotY = sprite.pivot.y / sprite.rect.height - 0.5f;

        float ix = -0.5f + pivotX / spriteSheetU;
        float iy = -0.5f + pivotY / spriteSheetV;

        Vector2 uvOffset = new Vector2(uvRect.center.x + ix, uvRect.center.y + iy);

        Polygon2D polygon2D = Polygon2D.CreateFromCollider(gameObject);

        polygon2D.CreateMesh(gameObject, scale, uvOffset, triangulation);

        MeshRenderer meshRenderer = gameObject.GetComponent <MeshRenderer> ();

        if (meshRenderer == null)
        {
            meshRenderer = gameObject.AddComponent <MeshRenderer> ();
        }

        meshRenderer.sharedMaterial             = spriteRenderer.material;
        meshRenderer.sharedMaterial.mainTexture = texture;
        meshRenderer.sharedMaterial.color       = spriteRenderer.color;

        meshRenderer.sortingLayerName = spriteRenderer.sortingLayerName;
        meshRenderer.sortingLayerID   = spriteRenderer.sortingLayerID;
        meshRenderer.sortingOrder     = spriteRenderer.sortingOrder;
    }
コード例 #17
0
    void Start()
    {
        // Generate Mesh from collider
        Polygon2D polygon = Polygon2D.CreateFromCollider(gameObject);

        if (polygon != null)
        {
            polygon.CreateMesh3D(gameObject, size, Vector2.zero, Vector2.zero, triangulation);

            // Setting Mesh material
            if (material != null)
            {
                MeshRenderer meshRenderer = GetComponent <MeshRenderer> ();
                meshRenderer.material = material;

                meshRenderer.sortingLayerName = sortingLayerName;
                meshRenderer.sortingLayerID   = sortingLayerID;
                meshRenderer.sortingOrder     = sortingOrder;
            }
        }
    }
コード例 #18
0
    void OnSliceResult(Slice2D sliceResult)
    {
        if (polygons.Count < 1)
        {
            return;
        }

        List <GameObject> gameObjects = new List <GameObject>();

        foreach (GameObject p in sliceResult.gameObjects)
        {
            Polygon2D polyA   = Polygon2D.CreateFromCollider(p).ToWorldSpace(p.transform);
            bool      perform = true;

            foreach (Polygon2D polyB in polygons)
            {
                if (Math2D.PolyCollidePoly(polyA, GetPolygonInWorldSpace(polyB)))
                {
                    perform = false;
                }
            }

            if (perform)
            {
                gameObjects.Add(p);
            }
        }

        foreach (GameObject p in gameObjects)
        {
            switch (anchorType)
            {
            case AnchorType.AttachRigidbody:
                if (p.GetComponent <Rigidbody2D> () == null)
                {
                    p.AddComponent <Rigidbody2D> ();
                }

                p.GetComponent <Rigidbody2D> ().isKinematic = false;
                break;

            case AnchorType.RemoveConstraints:
                if (p.GetComponent <Rigidbody2D> () != null)
                {
                    p.GetComponent <Rigidbody2D> ().constraints = 0;
                    p.GetComponent <Rigidbody2D>().useAutoMass  = true;
                }
                break;

            default:
                break;
            }
            Destroy(p.GetComponent <Slicer2DAnchors>());
        }

        if (gameObjects.Count > 0)
        {
            Slice2D newSlice = Slice2D.Create(sliceResult.sliceType);
            newSlice.gameObjects = gameObjects;

            if ((sliceResultEvent != null))
            {
                sliceResultEvent(newSlice);
            }
        }
    }
コード例 #19
0
    void SliceJointEvent(Slice2D sliceResult)
    {
        RecalculateJoints();

        // Remove Slicer Component Duplicated From Sliced Components
        foreach (GameObject g in sliceResult.gameObjects)
        {
            List <Joint2D> joints = Joint2D.GetJoints(g);
            foreach (Joint2D joint in joints)
            {
                if (Polygon2D.CreateFromCollider(g).PointInPoly(new Vector2D(joint.anchoredJoint2D.anchor)) == false)
                {
                    Destroy(joint.anchoredJoint2D);
                }
                else
                {
                    if (joint.anchoredJoint2D != null && joint.anchoredJoint2D.connectedBody != null)
                    {
                        Slicer2D slicer2D = joint.anchoredJoint2D.connectedBody.gameObject.GetComponent <Slicer2D>();
                        if (slicer2D != null)
                        {
                            slicer2D.RecalculateJoints();
                        }
                    }
                }
            }
        }

        if (body2D == null)
        {
            return;
        }

        // Reconnect Joints To Sliced Bodies
        foreach (Joint2D joint in joints)
        {
            if (joint.anchoredJoint2D == null)
            {
                continue;
            }

            foreach (GameObject g in sliceResult.gameObjects)
            {
                Polygon2D poly = Polygon2D.CreateFromCollider(g);

                switch (joint.jointType)
                {
                case Joint2D.Type.HingeJoint2D:
                    if (poly.PointInPoly(new Vector2D(Vector2.zero)))
                    {
                        joint.anchoredJoint2D.connectedBody = g.GetComponent <Rigidbody2D> ();
                    }
                    break;

                default:
                    if (poly.PointInPoly(new Vector2D(joint.anchoredJoint2D.connectedAnchor)))
                    {
                        joint.anchoredJoint2D.connectedBody = g.GetComponent <Rigidbody2D> ();
                    }
                    break;
                }
            }
        }
    }