/// <summary> /// 接触判定命令 /// </summary> /// <param name="tcol">判定コリジョン</param> /// <returns>-1:中断, 0:未接触, 1:接触</returns> private int ScanOrder(Collision tcol) { if (!tcol.enable) { return(0); } if (!ccol.enable) { return(-1); } bool hit = false; switch (ccol.form) { // 自分:円 case COL_FORM.CIRCLE: // 対象:円 if (tcol.form == COL_FORM.CIRCLE) { hit = Vector2.Distance(ccol.point, tcol.point) <= (ccol.range + tcol.range); break; } // 対象:矩形 hit = CollisionPool.IsOverlapCircleToRect(ccol, tcol); break; // 自分:矩形 case COL_FORM.RECTANGLE: // 対象:円 if (tcol.form == COL_FORM.CIRCLE) { hit = CollisionPool.IsOverlapCircleToRect(tcol, ccol); break; } // 対象:矩形 hit = CollisionPool.HitRectangles(ccol, tcol); break; } #if DEBUG ccol.hit |= hit; tcol.hit |= hit; #endif return(hit ? 1 : 0); }
void Awake() { GameManager.collision = new CollisionPool(); GameManager.collision.Initialize(); Application.targetFrameRate = 60; }
/// <summary> /// 矩形同士の接触判定 /// </summary> /// <param name="ccol">自分</param> /// <param name="tcol">対象</param> private static bool HitRectangles(Collision ccol, Collision tcol) { Vector2 cpos = ccol.point; Vector2 tpos = tcol.point; // 絶対に接触しない距離なら判定回避 float dist = Vector2.Distance(cpos, tpos); if (dist > (ccol.range + tcol.range)) { return(false); } float cRad = ccol.angle * Mathf.Deg2Rad; float cCos = (float)System.Math.Cos(cRad); float cSin = (float)System.Math.Sin(cRad); float tRad = tcol.angle * Mathf.Deg2Rad; float tCos = (float)System.Math.Cos(tRad); float tSin = (float)System.Math.Sin(tRad); float cRangeX = ccol.size.x * 0.5f; float cRangeY = ccol.size.y * 0.5f; float tRangeX = tcol.size.x * 0.5f; float tRangeY = tcol.size.y * 0.5f; // 自分の4頂点を取得 cPt[0].x = -cRangeX * cCos - cRangeY * cSin + cpos.x; cPt[0].y = -cRangeX * cSin + cRangeY * cCos + cpos.y; cPt[1].x = cRangeX * cCos - cRangeY * cSin + cpos.x; cPt[1].y = cRangeX * cSin + cRangeY * cCos + cpos.y; cPt[2].x = cRangeX * cCos - -cRangeY * cSin + cpos.x; cPt[2].y = cRangeX * cSin + -cRangeY * cCos + cpos.y; cPt[3].x = -cRangeX * cCos - -cRangeY * cSin + cpos.x; cPt[3].y = -cRangeX * cSin + -cRangeY * cCos + cpos.y; // 対象の4頂点を取得 tPt[0].x = -tRangeX * tCos - tRangeY * tSin + tpos.x; tPt[0].y = -tRangeX * tSin + tRangeY * tCos + tpos.y; tPt[1].x = tRangeX * tCos - tRangeY * tSin + tpos.x; tPt[1].y = tRangeX * tSin + tRangeY * tCos + tpos.y; tPt[2].x = tRangeX * tCos - -tRangeY * tSin + tpos.x; tPt[2].y = tRangeX * tSin + -tRangeY * tCos + tpos.y; tPt[3].x = -tRangeX * tCos - -tRangeY * tSin + tpos.x; tPt[3].y = -tRangeX * tSin + -tRangeY * tCos + tpos.y; // 線分交差処理はもっと上手く出来るハズ // 上辺 if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[0], ref tPt[1])) { return(true); } if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[1], ref tPt[2])) { return(true); } if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[2], ref tPt[3])) { return(true); } if (CrossLine(ref cPt[0], ref cPt[1], ref tPt[3], ref tPt[0])) { return(true); } // 右辺 if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[0], ref tPt[1])) { return(true); } if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[1], ref tPt[2])) { return(true); } if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[2], ref tPt[3])) { return(true); } if (CrossLine(ref cPt[1], ref cPt[2], ref tPt[3], ref tPt[0])) { return(true); } // 下辺 if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[0], ref tPt[1])) { return(true); } if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[1], ref tPt[2])) { return(true); } if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[2], ref tPt[3])) { return(true); } if (CrossLine(ref cPt[2], ref cPt[3], ref tPt[3], ref tPt[0])) { return(true); } // 左辺 if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[0], ref tPt[1])) { return(true); } if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[1], ref tPt[2])) { return(true); } if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[2], ref tPt[3])) { return(true); } if (CrossLine(ref cPt[3], ref cPt[0], ref tPt[3], ref tPt[0])) { return(true); } // 対象が自分に内包されているか cPt[0] = new Vector2(-cRangeX, cRangeY); cPt[1] = new Vector2(cRangeX, cRangeY); cPt[2] = new Vector2(cRangeX, -cRangeY); cPt[3] = new Vector2(-cRangeX, -cRangeY); Vector2 point = tpos - cpos; Vector2 checkPt; checkPt.x = point.x * cCos - point.y * -cSin; checkPt.y = point.x * -cSin + point.y * cCos; if (CollisionPool.PointInRect(ref checkPt, cPt)) { return(true); } // 自分が対象に内包されているか tPt[0] = new Vector2(-tRangeX, tRangeY); tPt[1] = new Vector2(tRangeX, tRangeY); tPt[2] = new Vector2(tRangeX, -tRangeY); tPt[3] = new Vector2(-tRangeX, -tRangeY); point = cpos - tpos; checkPt.x = point.x * tCos - point.y * -tSin; checkPt.y = point.x * -tSin + point.y * tCos; if (CollisionPool.PointInRect(ref checkPt, tPt)) { return(true); } return(false); }
void Awake() { GameManager.collision = new CollisionPool(); GameManager.collision.Initialize(); }