Ejemplo n.º 1
0
 void OnGUI()
 {
     for (int s = 0; s < SegmentCount; s++)
     {
         LaserSegment segment = DrawSegments[s];
         DrawLaser(segment.Origin, segment.End);
     }
 }
Ejemplo n.º 2
0
 void AddLaserSegment(Vector3 origin, Vector3 end)
 {
     if (SegmentCount == MaxSegments)
     {
         return;
     }
     DrawSegments [SegmentCount++] = new LaserSegment(origin, end);
 }
Ejemplo n.º 3
0
    public void SetLength(int length)
    {
        if (_laserLen > 0)
        {
            return;
        }
        _laserLen = length;
        //if (!_isInitPos)
        //    Logger.LogWarn("It's nessesary to set init pos of linearlaser before setting it's length!");
        //_pathList.Add(_curPos);
        // 创建第一段segment
        LaserSegment segment = new LaserSegment();

        segment.Init(_laserSegmentProtoType, true).SetPath(_pathList).SetSegmentVec(0, 0);
        _laserSegmentList.Add(segment);
        _laserSegmentCount = 1;
        _isDirty           = true;
    }
Ejemplo n.º 4
0
    /// <summary>
    /// 创建LaserSegment对象
    /// <para>优先从缓存池中取出</para>
    /// </summary>
    /// <returns></returns>
    private LaserSegment CreateLaserSegment(int startIndex, int endIndex)
    {
        LaserSegment segment;

        if (_laserSegmentPool.Count > 0)
        {
            segment = _laserSegmentPool.Pop();
            segment.SetEnable(true);
            segment.SetSegmentVec(startIndex, endIndex);
        }
        else
        {
            segment = new LaserSegment();
            segment.Init(_laserSegmentProtoType, false).SetPath(_pathList).SetSegmentVec(startIndex, endIndex).SetAngle(_curVAngle);
        }
        if (!_isOriginalColor)
        {
            segment.SetAlpha(_curAlpha).SetColor(_curColor);
        }
        return(segment);
    }
Ejemplo n.º 5
0
    // Update is called once per frame
    void FixedUpdate()
    {
        List<LaserBeam> beamsToDelete = new List<LaserBeam>();
        foreach(LaserBeam beam in beams)
        {
            if(beam.segments.Count <= 0)
            {
                beamsToDelete.Add(beam);
                continue;
            }

            bool removeStartSegment = false;

            //move beams
            LaserSegment startSegment= beam.segments[0];
            LaserSegment endSegment = beam.segments[beam.segments.Count - 1];

            float speed = beam.bounced ? laserSpeed : laserStartSpeedEnd;

            endSegment.end += endSegment.direction * speed * Time.fixedDeltaTime;

            float beamLength = 0;
            foreach (LaserSegment segment in beam.segments)
                beamLength += segment.length;

            if (!beam.bounced)
            {
                if (beamLength < laserLength)
                    speed = laserStartSpeedStart;
                else
                    speed = laserStartSpeedEnd;
            }
            else if (beamLength > laserLength)
            {
                speed = laserSpeed;
            }
            else if (startSegment != endSegment)
                speed = laserSpeed;

            Vector2 delta = startSegment.direction * speed * Time.fixedDeltaTime;
            Vector2 proxy = startSegment.start + delta;

            Vector2 proxyToEnd = (startSegment.end - proxy).normalized;

            if (Vector2.Dot(startSegment.direction, proxyToEnd) < 0.5f)
            {
                removeStartSegment = true;
            }
            else
                startSegment.start += delta;

            //beam.segments[0] = startSegment;
            //beam.segments[beam.segments.Count - 1] = endSegment;

            //see if beam should bounce on walls or objects
            int hitResultCount = Physics2D.LinecastNonAlloc (endSegment.start, endSegment.end, hits );
            for(int i = 0 ; i < hitResultCount ; i++)
            {
                RaycastHit2D hit = hits[i];
                if(hit.transform.CompareTag(bounceTag))
                {
                    beam.bounced = true;
                  //  Debug.Break();

                    //clamp segment to wall
                    endSegment.end = hit.point - endSegment.direction * hitPadding;

                    Vector3 normal = new Vector3(hit.normal.x, hit.normal.y, 0);

          //                  if (hit.fraction == 0)
        //                        normal = -normal;

                    Vector3 outDir = Vector3.Reflect(endSegment.direction3D, normal);

                    LaserSegment bouncedSegment = new LaserSegment(endSegment.end, new Vector2(outDir.x, outDir.y));

                    beam.segments.Add(bouncedSegment);

                    break;
                }
            }

            //hit detection
            foreach(LaserSegment segment in beam.segments)
            {
                hitResultCount = Physics2D.LinecastNonAlloc (endSegment.start, endSegment.end, hits );

                for(int i = 0 ; i < hitResultCount ; i++)
                {
                    RaycastHit2D hit = hits[i];
                    if (hit.transform.CompareTag(killTag))
                    {
                        hit.transform.SendMessageUpwards("OnLaserHit", SendMessageOptions.DontRequireReceiver);
                    }
                }
            }

            if (removeStartSegment)
                beam.segments.RemoveAt(0);
        }

        foreach (LaserBeam beam in beamsToDelete)
            beams.Remove(beam);
    }
Ejemplo n.º 6
0
    // Update is called once per frame
    void FixedUpdate()
    {
        List <LaserBeam> beamsToDelete = new List <LaserBeam>();

        foreach (LaserBeam beam in beams)
        {
            if (beam.segments.Count <= 0)
            {
                beamsToDelete.Add(beam);
                continue;
            }

            bool removeStartSegment = false;



            //move beams
            LaserSegment startSegment = beam.segments[0];
            LaserSegment endSegment   = beam.segments[beam.segments.Count - 1];

            float speed = beam.bounced ? laserSpeed : laserStartSpeedEnd;

            endSegment.end += endSegment.direction * speed * Time.fixedDeltaTime;

            float beamLength = 0;
            foreach (LaserSegment segment in beam.segments)
            {
                beamLength += segment.length;
            }

            if (!beam.bounced)
            {
                if (beamLength < laserLength)
                {
                    speed = laserStartSpeedStart;
                }
                else
                {
                    speed = laserStartSpeedEnd;
                }
            }
            else if (beamLength > laserLength)
            {
                speed = laserSpeed;
            }
            else if (startSegment != endSegment)
            {
                speed = laserSpeed;
            }

            Vector2 delta = startSegment.direction * speed * Time.fixedDeltaTime;
            Vector2 proxy = startSegment.start + delta;

            Vector2 proxyToEnd = (startSegment.end - proxy).normalized;

            if (Vector2.Dot(startSegment.direction, proxyToEnd) < 0.5f)
            {
                removeStartSegment = true;
            }
            else
            {
                startSegment.start += delta;
            }



            //beam.segments[0] = startSegment;
            //beam.segments[beam.segments.Count - 1] = endSegment;

            //see if beam should bounce on walls or objects
            int hitResultCount = Physics2D.LinecastNonAlloc(endSegment.start, endSegment.end, hits);
            for (int i = 0; i < hitResultCount; i++)
            {
                RaycastHit2D hit = hits[i];
                if (hit.transform.CompareTag(bounceTag))
                {
                    beam.bounced = true;
                    //  Debug.Break();

                    //clamp segment to wall
                    endSegment.end = hit.point - endSegment.direction * hitPadding;

                    Vector3 normal = new Vector3(hit.normal.x, hit.normal.y, 0);

                    //                  if (hit.fraction == 0)
//                        normal = -normal;

                    Vector3 outDir = Vector3.Reflect(endSegment.direction3D, normal);

                    LaserSegment bouncedSegment = new LaserSegment(endSegment.end, new Vector2(outDir.x, outDir.y));

                    beam.segments.Add(bouncedSegment);

                    break;
                }
            }

            //hit detection
            foreach (LaserSegment segment in beam.segments)
            {
                hitResultCount = Physics2D.LinecastNonAlloc(endSegment.start, endSegment.end, hits);

                for (int i = 0; i < hitResultCount; i++)
                {
                    RaycastHit2D hit = hits[i];
                    if (hit.transform.CompareTag(killTag))
                    {
                        hit.transform.SendMessageUpwards("OnLaserHit", SendMessageOptions.DontRequireReceiver);
                    }
                }
            }

            if (removeStartSegment)
            {
                beam.segments.RemoveAt(0);
            }
        }

        foreach (LaserBeam beam in beamsToDelete)
        {
            beams.Remove(beam);
        }
    }
Ejemplo n.º 7
0
    /// <summary>
    /// 检测是否需要将激光分成多段
    /// </summary>
    private void CheckDivideIntoMutiple()
    {
        if (_collidedSegmentCount == 0)
        {
            return;
        }
        //Logger.Log("-------LogSegmentBegin-------------------");
        //Logger.Log("-------SegmentsBeforeDivided-------------------");
        //for (int i = 0; i < _laserSegmentCount; i++)
        //{
        //    Logger.Log(_laserSegmentList[i].GetSegmentVec());
        //}
        //Logger.Log("---------CollidedSegments----------------------");
        Vector2 laserSegmentVec, collidedSegmentVec;
        Vector2 divideSegment0, divideSegment1;
        // segment是碰撞分段的起始、结束下标索引
        int laserSegmentLen;

        for (int i = 0; i < _collidedSegmentCount; i++)
        {
            collidedSegmentVec = _collisionSegmentList[_collidedSegmentIndexList[i]];
            //Logger.Log(collidedSegmentVec);
            for (int j = 0; j < _laserSegmentCount; j++)
            {
                laserSegmentVec = _laserSegmentList[j].GetSegmentVec();
                laserSegmentLen = (int)(laserSegmentVec.y - laserSegmentVec.x);
                if (laserSegmentLen > 0 && (collidedSegmentVec.x >= laserSegmentVec.y || collidedSegmentVec.y <= laserSegmentVec.x))
                {
                    continue;
                }
                //分四种情况,上为collidedSegmentVec,下为laserSegmentVec
                // 最优先判断会被全部截取掉的情况
                //    ----------
                //      ------
                if (collidedSegmentVec.x <= laserSegmentVec.x && collidedSegmentVec.y >= laserSegmentVec.y)
                {
                    LaserSegment segment = _laserSegmentList[j];
                    _laserSegmentList.RemoveAt(j);
                    _laserSegmentCount--;
                    j--;
                    RestoreLaserSegment(segment);
                }
                //    ---------
                //  -----
                else if (collidedSegmentVec.x >= laserSegmentVec.x && collidedSegmentVec.y >= laserSegmentVec.y)
                {
                    divideSegment0 = new Vector2(laserSegmentVec.x, collidedSegmentVec.x);
                    _laserSegmentList[j].SetSegmentVec(divideSegment0);
                }
                //    ---------
                //      -----------
                else if (collidedSegmentVec.x <= laserSegmentVec.x && collidedSegmentVec.y <= laserSegmentVec.y)
                {
                    divideSegment0 = new Vector2(collidedSegmentVec.y, laserSegmentVec.y);
                    _laserSegmentList[j].SetSegmentVec(divideSegment0);
                }
                //    ---------
                //  -------------
                else if (collidedSegmentVec.x >= laserSegmentVec.x && collidedSegmentVec.y <= laserSegmentVec.y)
                {
                    divideSegment0 = new Vector2(laserSegmentVec.x, collidedSegmentVec.x);
                    divideSegment1 = new Vector2(collidedSegmentVec.y, laserSegmentVec.y);
                    _laserSegmentList[j].SetSegmentVec(divideSegment0);
                    LaserSegment segment = CreateLaserSegment((int)divideSegment1.x, (int)divideSegment1.y);
                    _laserSegmentList.Insert(j + 1, segment);
                    _laserSegmentCount++;
                    j++;
                }
            }
        }
        _collidedSegmentIndexList.Clear();
        _collidedSegmentCount     = 0;
        _isCachedCollisionSegment = false;
        //Logger.Log("-------SegmentsAfterDivided-------------------");
        //for (int i = 0; i < _laserSegmentCount; i++)
        //{
        //    Logger.Log(_laserSegmentList[i].GetSegmentVec());
        //}
        //Logger.Log("----------LogSegmentEnd----------------");
        _isDirty = true;
    }
Ejemplo n.º 8
0
 /// <summary>
 /// 缓存LaserSegment对象
 /// </summary>
 /// <param name="segment"></param>
 private void RestoreLaserSegment(LaserSegment segment)
 {
     segment.SetEnable(false);
     _laserSegmentPool.Push(segment);
 }
Ejemplo n.º 9
0
 protected virtual void UpdatePath()
 {
     _movableObj.Update();
     _curPos = _movableObj.GetPos();
     // 添加新的路径点
     _pathList.Add(_curPos);
     _curV = _movableObj.velocity;
     if (_curV != _preV)
     {
         _timeSinceLastVChanged = 0;
     }
     if (_pathCount > _laserLen)
     {
         _pathList.RemoveAt(0);
         // 加速度不为0,说明长度改变了,重绘激光图像
         if (_curAcce != 0 || _timeSinceLastVChanged <= _laserLen)
         {
             _isDirty = true;
         }
         SetSourceEnable(false);
     }
     else
     {
         _pathCount++;
         // 激光未生成完全,且激光源未被消除
         int updateIndex = 0;
         if (!_isSourceEliminated)
         {
             if (_laserSegmentCount == 0)
             {
                 LaserSegment segment = CreateLaserSegment(0, 1);
                 _laserSegmentList.Add(segment);
                 _laserSegmentCount++;
             }
             else
             {
                 int     firstSegmentIndex = 0;
                 Vector2 firstSegmentVec   = _laserSegmentList[firstSegmentIndex].GetSegmentVec();
                 if (firstSegmentVec.x == 0)
                 {
                     firstSegmentVec.y += 1;
                     _laserSegmentList[firstSegmentIndex].SetSegmentVec(firstSegmentVec);
                 }
                 else
                 {
                     LaserSegment segment = CreateLaserSegment(0, 1);
                     _laserSegmentList.Insert(firstSegmentIndex, segment);
                     _laserSegmentCount++;
                 }
             }
             updateIndex = 1;
         }
         // 线段索引起始点、终点全部+1
         Vector2 segmentVec;
         for (int i = updateIndex; i < _laserSegmentCount; i++)
         {
             segmentVec = _laserSegmentList[i].GetSegmentVec();
             _laserSegmentList[i].SetSegmentVec(new Vector2(segmentVec.x + 1, segmentVec.y + 1));
         }
         _isCachedCollisionSegment = false;
         _isDirty = true;
     }
 }