void Update()
    {
        if (numberOfCurrentPoints == laser.lines.Count)
        {
            if (Vector3.Distance(line.GetPosition(currentlyAnimated), (laser.lines[currentlyAnimated])) > 0.1f)
            {
                line.SetPosition(currentlyAnimated, Vector3.Lerp(line.GetPosition(currentlyAnimated), laser.lines[currentlyAnimated], distancePerFrame));
            }
            else if (line.positionCount < laser.lines.Count)
            {
                line.positionCount++;
                currentlyAnimated++;
                line.SetPosition(currentlyAnimated, line.GetPosition(currentlyAnimated - 1));
            }
            else
            {
                IInvoked toInvoke = laser.invokedLater;
                if (toInvoke != null)
                {
                    toInvoke.InvokeOnHit(laser.laserDirection);
                }
            }
        }
        else
        {
            numberOfCurrentPoints = laser.lines.Count;
            line.positionCount    = 2;
            line.SetPosition(0, transform.position);
            line.SetPosition(1, transform.position);
            currentlyAnimated = 1;
        }

        /*
         *      old, boring line rendering
         *
         *      line.positionCount = laser.lines.Count;
         *      int i = 0;
         *      foreach (var laserPoint in laser.lines)
         *      {
         *              line.SetPosition(i,laserPoint);
         *              i++;
         *      }
         */
    }
Esempio n. 2
0
    void Update()
    {
        SyncDirection();
        //line.positionCount = 1;
        lines.RemoveRange(1, lines.Count - 1);
        bool keepReflecting = true;

        //line.SetPosition(0, transform.position);
        lines[0]      = transform.position;
        startingPoint = transform.position;
        int vertexCounter   = 0;
        int reflectionCount = 0;

        do
        {
            int          layerMask = LayerMask.GetMask("World");
            RaycastHit2D hit       = Physics2D.Raycast((Vector2)startingPoint + laserDirection * 0.5f, laserDirection, laserLength, layerMask);
            vertexCounter++;
            //line.positionCount += 1;
            lines.Add(transform.position);
            if (hit)
            {
                reflectionCount += 1;
                if (hit.collider.GetComponent <Wall>())
                {
                    //line.SetPosition(vertexCounter, (Vector3)hit.point);
                    lines[vertexCounter] = (Vector3)hit.point;
                }
                else
                {
                    //line.SetPosition(vertexCounter, (Vector3)hit.collider.transform.position);
                    lines[vertexCounter] = (Vector3)hit.collider.transform.position;
                }
                Mirror mirror = hit.collider.GetComponent <Mirror>();
                if (mirror != null && reflectionCount < 100)
                {
                    //mirror.InvokeOnHit(laserDirection);
                    invokedLater   = mirror.GetComponent <IInvoked>();
                    laserDirection = mirror.GetNextDirection(laserDirection);
                    if (laserDirection == Vector2.zero)
                    {
                        keepReflecting = false;
                    }
                    else
                    {
                        startingPoint = mirror.transform.position;
                    }
                }
                else
                {
                    IInvoked hitByLaser = hit.collider.GetComponent <IInvoked>();
                    if (hitByLaser != null)
                    {
                        //hitByLaser.InvokeOnHit(laserDirection);
                        invokedLater = hitByLaser;
                    }
                    else
                    {
                        invokedLater = null;
                    }
                    keepReflecting = false;
                }
            }
            else
            {
                if (vertexCounter == 1)
                {
                    //line.positionCount = 2;
                    if (lines.Count > 2)
                    {
                        lines.RemoveRange(2, lines.Count - 2);
                    }
                    else
                    {
                        while (lines.Count != 2)
                        {
                            lines.Add(transform.position);
                        }
                    }
                }
                //line.SetPosition(vertexCounter, (Vector3)startingPoint + (Vector3)laserDirection * laserLength);
                lines[vertexCounter] = (Vector3)startingPoint + (Vector3)laserDirection * laserLength;
                keepReflecting       = false;
            }
        } while (keepReflecting);
    }