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 }
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 } }