コード例 #1
0
    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);
    }
コード例 #2
0
    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
        }
    }