static void CircleCollision(ElementCollider collider, ElementCollider tar) { if (collider.Radius == 0) { return; } switch (tar.collisionType) { case CollisionType.None: break; case CollisionType.Circle: if (huqiang.Physics2D.CircleToCircle(collider.Position, tar.Position, collider.Radius, tar.Radius)) { if (tar.OnCollision != null) { tar.OnCollision(collider); } } break; case CollisionType.Polygon: if (tar.points != null) { if (huqiang.Physics2D.CircleToPolygon(collider.Position, collider.Radius, tar.points)) { if (tar.OnCollision != null) { tar.OnCollision(collider); } } } break; } }
private static void CreateCutLineColliders(ElementCollider elementCollider, float radius) { Vector2[] positions = { new Vector2(0.3f, 0), new Vector2(0.7f, 0) }; for (int i = 0; i < positions.Length; i++) { CreateCollider(elementCollider, positions[i], i, radius); } }
private static void CreateCollider(ElementCollider elementCollider, Vector2 position, int index, float radius) { string name = string.Format("collider ({0})", index); GameObject gameObject = new GameObject(name); gameObject.layer = LayerMask.NameToLayer("Game"); gameObject.transform.SetParent(elementCollider.transform); gameObject.transform.localPosition = position; gameObject.transform.localScale = Vector3.one; gameObject.transform.localRotation = Quaternion.identity; CircleCollider2D circleCollider2D = gameObject.AddComponent <CircleCollider2D>(); circleCollider2D.radius = radius; circleCollider2D.isTrigger = true; }
public static void UpdateColliders(ElementCollider elementCollider, float radius = 0.075f) { elementCollider.gameObject.layer = LayerMask.NameToLayer("Game"); Collider2D collider2D = elementCollider.GetComponent <Collider2D>(); Rigidbody2D rigidbody2D = elementCollider.GetComponent <Rigidbody2D>(); if (collider2D != null) { DestroyImmediate(collider2D); } if (rigidbody2D != null) { DestroyImmediate(rigidbody2D); } rigidbody2D = elementCollider.gameObject.AddComponent <Rigidbody2D>(); rigidbody2D.bodyType = RigidbodyType2D.Kinematic; rigidbody2D.collisionDetectionMode = CollisionDetectionMode2D.Continuous; Transform[] children = elementCollider.transform.GetComponentsInChildren <Transform>(true); foreach (Transform transform in children) { if (transform == elementCollider.transform) { continue; } DestroyImmediate(transform.gameObject); } string name = elementCollider.name; if (name.StartsWith("line_curve")) { CreateLineCurveColliders(elementCollider, radius); } else if (name.StartsWith("cut_line")) { CreateCutLineColliders(elementCollider, radius); } else { CircleCollider2D circleCollider2D = elementCollider.gameObject.AddComponent <CircleCollider2D>(); circleCollider2D.isTrigger = true; circleCollider2D.radius = radius; } }
public void CheckCollision(ElementCollider tar) { switch (collisionType) { case CollisionType.None: break; case CollisionType.Circle: CircleCollision(this, tar); break; case CollisionType.Rectangle: case CollisionType.Polygon: PolygonCollision(this, tar); break; } }
private void OnEnable() { this.target = base.target as ElementCollider; }