Пример #1
0
    private void MakeMesh()
    {
        timer += Time.deltaTime;
        if (timer < maxTime)
        {
            return;
        }
        if (beams.Count <= 0)
        {
            return;
        }

        lightup.Light();
        foreach (BeamPair pair in beams)
        {
            Vector3 left = pair.Beam1.Point;
            Vector3 leftEnd;
            Vector3 right = pair.Beam2.Point;
            Vector3 rightEnd;

            RaycastHit2D leftHit  = new RaycastHit2D();
            RaycastHit2D rightHit = new RaycastHit2D();

            bool reflectL = false;
            bool reflectR = false;

            ReflectionHandler l = null;
            ReflectionHandler r = null;

            BeamFOV.Beam point1 = new BeamFOV.Beam();
            BeamFOV.Beam point2 = new BeamFOV.Beam();

            col.enabled = false;

            leftHit  = Physics2D.Raycast(left, pair.Beam1.Dir, pair.Beam1.Distance, ObstacleMask + CharacterMask + InteractableMask);
            rightHit = Physics2D.Raycast(right, pair.Beam2.Dir, pair.Beam2.Distance, ObstacleMask + CharacterMask + InteractableMask);
            //myHandler.handler.AddHit(leftHit);
            //myHandler.handler.AddHit(rightHit);


            if (myHandler.handler.bulb.power == Bulb.Power.XRAY)
            {
                rightHit = Physics2D.Raycast(right, pair.Beam2.Dir, pair.Beam2.Distance, CharacterMask + InteractableMask);
            }
            if (myHandler.handler.bulb.power == Bulb.Power.XRAY)
            {
                leftHit = Physics2D.Raycast(left, pair.Beam1.Dir, pair.Beam1.Distance, CharacterMask + InteractableMask);
            }
            if (leftHit.collider == null)
            {
                leftEnd = left + pair.Beam1.Dir * pair.Beam1.Distance;
            }
            else if (InteractableMask == (InteractableMask | (1 << leftHit.collider.gameObject.layer)))
            {
                myHandler.handler.AddInteractable(leftHit.collider.gameObject.transform);
                if (myHandler.handler.bulb.power == Bulb.Power.XRAY)
                {
                    leftHit = Physics2D.Raycast(left, pair.Beam1.Dir, pair.Beam1.Distance, CharacterMask);
                }
                else
                {
                    leftHit = Physics2D.Raycast(left, pair.Beam1.Dir, pair.Beam1.Distance, ObstacleMask + CharacterMask);
                }
            }
            else
            {
                myHandler.handler.AddHit(leftHit);
            }
            if (rightHit.collider == null)
            {
                rightEnd = right + pair.Beam2.Dir * pair.Beam2.Distance;
            }

            else if (InteractableMask == (InteractableMask | (1 << rightHit.collider.gameObject.layer)))
            {
                myHandler.handler.AddInteractable(rightHit.collider.gameObject.transform);
                if (myHandler.handler.bulb.power == Bulb.Power.XRAY)
                {
                    rightHit = Physics2D.Raycast(right, pair.Beam2.Dir, pair.Beam2.Distance, CharacterMask);
                }
                else
                {
                    rightHit = Physics2D.Raycast(right, pair.Beam2.Dir, pair.Beam2.Distance, ObstacleMask + CharacterMask);
                }
            }
            else
            {
                myHandler.handler.AddHit(rightHit);
            }


            col.enabled = true;


            if (leftHit.collider == null)
            {
                leftEnd = left + pair.Beam1.Dir * pair.Beam1.Distance;
            }
            else
            {
                leftEnd = leftHit.point;

                reflectL = true;
                l        = leftHit.collider.GetComponent <ReflectionHandler>();
                float deltaD = pair.Beam1.Distance - (leftEnd - left).magnitude;
                point1 = new BeamFOV.Beam(leftEnd, deltaD, Vector3.Reflect(pair.Beam1.Dir, leftHit.normal));
            }
            if (rightHit.collider == null)
            {
                rightEnd = right + pair.Beam2.Dir * pair.Beam2.Distance;
            }
            else
            {
                rightEnd = rightHit.point;

                reflectR = true;
                r        = rightHit.collider.GetComponent <ReflectionHandler>();
                float deltaD = pair.Beam2.Distance - (rightEnd - right).magnitude;
                point2 = new BeamFOV.Beam(rightEnd, deltaD, Vector3.Reflect(pair.Beam2.Dir, rightHit.normal));
            }

            if (reflectL && reflectR && l != null)
            {
                if (l == r)
                {
                    l.AddBeam(point1, point2);
                }
            }

            int topLeft  = AddPoint(leftEnd);
            int topRight = AddPoint(rightEnd);
            int botLeft  = AddPoint(left);
            int botRight = AddPoint(right);

            AddRect(topLeft, topRight, botLeft, botRight);
        }
    }
Пример #2
0
    private void MakeMesh()
    {
        left   = transform.position;
        left  -= transform.right * width / 2.0f;
        right  = transform.position;
        right += transform.right * width / 2.0f;

        leftHit  = new RaycastHit2D();
        rightHit = new RaycastHit2D();

        bool reflectL = false;
        bool reflectR = false;

        ReflectionHandler l = null;
        ReflectionHandler r = null;

        Beam point1 = new Beam();
        Beam point2 = new Beam();

        leftHit  = Physics2D.Raycast(left, transform.up, distance, ObstacleMask + CharacterMask + InteractableMask + xrayProof);
        rightHit = Physics2D.Raycast(right, transform.up, distance, ObstacleMask + CharacterMask + InteractableMask + xrayProof);
        if (handler.bulb.power == Bulb.Power.XRAY)
        {
            leftHit = Physics2D.Raycast(left, transform.up, distance, CharacterMask + InteractableMask + xrayProof);
        }
        if (handler.bulb.power == Bulb.Power.XRAY)
        {
            rightHit = Physics2D.Raycast(right, transform.up, distance, CharacterMask + InteractableMask + xrayProof);
        }
        if (leftHit.collider == null)
        {
            leftEnd = left + transform.up * distance;
        }
        else if (InteractableMask == (InteractableMask | (1 << leftHit.collider.gameObject.layer)))
        {
            setLists(leftHit);
            if (handler.bulb.power == Bulb.Power.XRAY)
            {
                leftHit = Physics2D.Raycast(left, transform.up, distance, CharacterMask + xrayProof);
            }
            else
            {
                leftHit = Physics2D.Raycast(left, transform.up, distance, ObstacleMask + CharacterMask + xrayProof);
            }
            if (leftHit.collider == null)
            {
                leftEnd = left + transform.up * distance;
            }
            else if (xrayProof == (xrayProof | (1 << leftHit.collider.gameObject.layer)))
            {
                leftEnd = leftHit.point;
            }
            else
            {
                leftEnd = leftHit.point;

                reflectL = true;
                l        = leftHit.collider.GetComponent <ReflectionHandler>();
                float deltaD = distance - (leftEnd - left).magnitude;
                point1 = new Beam(leftEnd, deltaD, Vector3.Reflect(transform.up, leftHit.normal));
            }
        }
        else if (CharacterMask == (CharacterMask | (1 << leftHit.collider.gameObject.layer)))
        {
            setLists(leftHit);
            leftHit = Physics2D.Raycast(left, transform.up, distance, xrayProof);

            if (leftHit.collider == null)
            {
                leftEnd = left + transform.up * distance;
            }
            else if (xrayProof == (xrayProof | (1 << leftHit.collider.gameObject.layer)))
            {
                leftEnd = leftHit.point;
            }
            else
            {
                leftEnd = leftHit.point;

                reflectL = true;
                l        = leftHit.collider.GetComponent <ReflectionHandler>();
                float deltaD = distance - (leftEnd - left).magnitude;
                point1 = new Beam(leftEnd, deltaD, Vector3.Reflect(transform.up, leftHit.normal));
            }
        }
        else if (xrayProof == (xrayProof | (1 << leftHit.collider.gameObject.layer)))
        {
            leftEnd = leftHit.point;
        }
        else
        {
            leftEnd = leftHit.point;

            reflectL = true;
            l        = leftHit.collider.GetComponent <ReflectionHandler>();
            float deltaD = distance - (leftEnd - left).magnitude;
            point1 = new Beam(leftEnd, deltaD, Vector3.Reflect(transform.up, leftHit.normal));
        }
        if (rightHit.collider == null)
        {
            rightEnd = right + transform.up * distance;
        }
        else if (InteractableMask == (InteractableMask | (1 << rightHit.collider.gameObject.layer)))
        {
            setLists(rightHit);
            if (handler.bulb.power == Bulb.Power.XRAY)
            {
                rightHit = Physics2D.Raycast(right, transform.up, distance, CharacterMask + xrayProof);
            }
            else
            {
                rightHit = Physics2D.Raycast(right, transform.up, distance, ObstacleMask + CharacterMask + xrayProof);
            }

            if (rightHit.collider == null)
            {
                rightEnd = right + transform.up * distance;
            }
            else if (xrayProof == (xrayProof | (1 << rightHit.collider.gameObject.layer)))
            {
                rightEnd = rightHit.point;
            }
            else
            {
                rightEnd = rightHit.point;

                reflectR = true;
                r        = rightHit.collider.GetComponent <ReflectionHandler>();
                float deltaD = distance - (rightEnd - right).magnitude;
                point2 = new Beam(rightEnd, deltaD, Vector3.Reflect(transform.up, rightHit.normal));
            }
        }
        else if (CharacterMask == (CharacterMask | (1 << rightHit.collider.gameObject.layer)))
        {
            setLists(rightHit);
            rightHit = Physics2D.Raycast(right, transform.up, distance, xrayProof);

            if (rightHit.collider == null)
            {
                rightEnd = right + transform.up * distance;
            }
            else if (xrayProof == (xrayProof | (1 << rightHit.collider.gameObject.layer)))
            {
                rightEnd = rightHit.point;
            }
            else
            {
                rightEnd = rightHit.point;

                reflectR = true;
                r        = rightHit.collider.GetComponent <ReflectionHandler>();
                float deltaD = distance - (rightEnd - right).magnitude;
                point2 = new Beam(rightEnd, deltaD, Vector3.Reflect(transform.up, rightHit.normal));
            }
        }
        else if (xrayProof == (xrayProof | (1 << rightHit.collider.gameObject.layer)))
        {
            rightEnd = rightHit.point;
        }
        else
        {
            rightEnd = rightHit.point;

            reflectR = true;
            r        = rightHit.collider.GetComponent <ReflectionHandler>();
            float deltaD = distance - (rightEnd - right).magnitude;
            point2 = new Beam(rightEnd, deltaD, Vector3.Reflect(transform.up, rightHit.normal));
        }
        if (!init)
        {
            init = true;
        }

        if (reflectL && reflectR && l != null)
        {
            if (l == r)
            {
                l.AddBeam(point1, point2);
            }
        }

        setLists(leftHit);
        setLists(rightHit);
    }