Exemplo n.º 1
0
    private void                RecreateCollider2D()
    {
#if !(UNITY_4_2 || UNITY_4_1 || UNITY_4_1 || UNITY_4_0 || UNITY_3_5 || UNITY_3_4 || UNITY_3_3 || UNITY_3_1 || UNITY_3_0)
        // make sure there's a collider component on this object
        if (GetComponent <PolygonCollider2D>() == null)
        {
            gameObject.AddComponent <PolygonCollider2D>();
        }
        if (physicsMaterial2D != null)
        {
            GetComponent <PolygonCollider2D>().sharedMaterial = physicsMaterial2D;
        }

        List <List <Vector2> > segs = GetColliderVerts();
        PolygonCollider2D      poly = GetComponent <PolygonCollider2D>();
        poly.pathCount = segs.Count;
        poly.isTrigger = isTrigger;
        if (segs.Count > 1 || (!collidersBottom || !collidersLeft || !collidersRight || !collidersTop))
        {
            for (int i = 0; i < segs.Count; i++)
            {
                poly.SetPath(i, ExpandColliderPath(segs[i], colliderThickness).ToArray());
            }
        }
        else
        {
            if (fill == Ferr2DT_FillMode.InvertedClosed)
            {
                Rect bounds = Ferr2D_Path.GetBounds(segs[0]);
                poly.pathCount = 2;
                poly.SetPath(0, segs[0].ToArray());
                poly.SetPath(1, new Vector2[] {
                    new Vector2(bounds.xMin - bounds.width, bounds.yMax + bounds.height),
                    new Vector2(bounds.xMax + bounds.width, bounds.yMax + bounds.height),
                    new Vector2(bounds.xMax + bounds.width, bounds.yMin - bounds.height),
                    new Vector2(bounds.xMin - bounds.width, bounds.yMin - bounds.height)
                });
            }
            else
            {
                if (segs.Count > 0 && segs[0].Count > 0)
                {
                    poly.SetPath(0, segs[0].ToArray());
                }
            }
        }
#else
        Debug.LogWarning("Ferr2DTerrain cannot create a 2D collider in Unity versions < 4.3! No collider has been generated!");
#endif
    }
Exemplo n.º 2
0
    private void                RecreateCollider2D()
    {
        List <Collider2D>      colliders = new List <Collider2D>(1);
        List <List <Vector2> > segs      = GetColliderVerts();
        bool closed = collidersBottom && collidersLeft && collidersRight && collidersTop;

        if (useEdgeCollider)
        {
            EdgeCollider2D[]      edges    = GetComponents <EdgeCollider2D>();
            List <EdgeCollider2D> edgePool = new List <EdgeCollider2D>(edges);
            int extra = edges.Length - segs.Count;

            if (extra > 0)
            {
                // we have too many, remove a few
                for (int i = 0; i < extra; i += 1)
                {
                    Destroy(edgePool[0]);
                    edgePool.RemoveAt(0);
                }
            }
            else
            {
                // we have too few, add in a few
                for (int i = 0; i < Mathf.Abs(extra); i += 1)
                {
                    edgePool.Add(gameObject.AddComponent <EdgeCollider2D>());
                }
            }

            for (int i = 0; i < segs.Count; i++)
            {
                EdgeCollider2D edge = edgePool[i];
                edge.points = segs[i].ToArray();
                colliders.Add(edge);
            }
        }
        else
        {
            // make sure there's a collider component on this object
            PolygonCollider2D poly = GetComponent <PolygonCollider2D>();
            if (poly == null)
            {
                poly = gameObject.AddComponent <PolygonCollider2D>();
            }
            colliders.Add(poly);

            poly.pathCount = segs.Count;
            if (segs.Count > 1 || !closed)
            {
                for (int i = 0; i < segs.Count; i++)
                {
                    poly.SetPath(i, ExpandColliderPath(segs[i], colliderThickness).ToArray());
                }
            }
            else
            {
                if (fill == Ferr2DT_FillMode.InvertedClosed)
                {
                    Rect bounds = Ferr2D_Path.GetBounds(segs[0]);
                    poly.pathCount = 2;
                    poly.SetPath(0, segs[0].ToArray());
                    poly.SetPath(1, new Vector2[] {
                        new Vector2(bounds.xMin - bounds.width, bounds.yMax + bounds.height),
                        new Vector2(bounds.xMax + bounds.width, bounds.yMax + bounds.height),
                        new Vector2(bounds.xMax + bounds.width, bounds.yMin - bounds.height),
                        new Vector2(bounds.xMin - bounds.width, bounds.yMin - bounds.height)
                    });
                }
                else
                {
                    if (segs.Count > 0 && segs[0].Count > 0)
                    {
                        poly.SetPath(0, segs[0].ToArray());
                    }
                }
            }
        }


        for (int i = 0; i < colliders.Count; i += 1)
        {
            colliders[i].isTrigger      = isTrigger;
            colliders[i].sharedMaterial = physicsMaterial2D;
                        #if UNITY_5
            colliders[i].usedByEffector = usedByEffector;
                        #endif
        }
    }