private static float ProceedOneCoverDistanceCast(Vector3 fromPos, Vector3 forward, float distance, ref MinMaxPair minMax, float invertDistance = -1) { RaycastHit hit; int Default = 1 << LayerMask.NameToLayer("Default"); int PhysicsMetal = 1 << LayerMask.NameToLayer("PhysicsMetal"); if (true == Physics.Raycast(fromPos, forward, out hit, distance, Default | PhysicsMetal)) { DebugDraw.LineOriented(Color.red, fromPos, fromPos + forward * distance, 0.05f); distance = (fromPos - hit.point).magnitude; if (Vector3.Dot(hit.normal, forward) > -0.1f) { if (invertDistance < 0) { distance = 0; } else { distance = invertDistance; } } else { if (true == VisualizeTests) { DebugDraw.DisplayTime = 0.00f; DebugDraw.Diamond(Color.green, 0.03f, hit.point); DebugDraw.LineOriented(VisualizationColor, hit.point, hit.point + hit.normal * 0.25f, 0.05f); } } } else { if (invertDistance < 0) { Debug.LogWarning("CoverUtils : Expected collision hit not found, position :" + fromPos); } return(distance); } if (invertDistance > 0) { minMax.Absorb(invertDistance - distance); } else { minMax.Absorb(distance); } return(distance); }
private void ProceedOneCoverDistances(Cover cover) { bool canStandRight = cover.TestFlags(Cover.E_CoverFlags.RightStand); bool canStandLeft = cover.TestFlags(Cover.E_CoverFlags.LeftStand); CoverUtils.VisualizationColor = Color.blue; if (true == canStandRight || true == canStandLeft) { m_DistanceToWallStand.Absorb(cover.GetWallDistanceExt(m_TestedCollisonDistance)); } else if (cover.TestFlags(Cover.E_CoverFlags.LeftCrouch) || cover.TestFlags(Cover.E_CoverFlags.RightCrouch)) { m_DistanceToWallCrouch.Absorb(cover.GetWallDistanceExt(m_TestedCollisonDistance)); } CoverUtils.VisualizationColor = Color.yellow; if (true == canStandRight) { m_DistanceStandCorner.Absorb(cover.GetCornerDistanceExt(true, m_TestedCollisonDistance)); } else if (cover.TestFlags(Cover.E_CoverFlags.RightCrouch)) { m_DistanceCrouchCorner.Absorb(cover.GetCornerDistanceExt(true, m_TestedCollisonDistance)); } else { // right side of cover without special flag } if (true == canStandLeft) { m_DistanceStandCorner.Absorb(cover.GetCornerDistanceExt(false, m_TestedCollisonDistance)); } else if (cover.TestFlags(Cover.E_CoverFlags.LeftCrouch)) { m_DistanceStandCorner.Absorb(cover.GetCornerDistanceExt(false, m_TestedCollisonDistance)); } else { // left side of cover without special flag } }