Ejemplo n.º 1
0
    // Update is called once per frame
    void Update()
    {
        var realColor = new Color(hasColor.HasFlag(LaserInfo.ColorCode.Red) ? 1 : 0.2f,
                                  hasColor.HasFlag(LaserInfo.ColorCode.Green) ? 1 : 0.2f,
                                  hasColor.HasFlag(LaserInfo.ColorCode.Blue) ? 1 : 0.2f);

        _sr.color = realColor;
    }
Ejemplo n.º 2
0
    // Update is called once per frame
    public void UpdateLaser()
    {
        if (dependentLaser)
        {
            transform.position = dependentLaser.end;
        }
        var pos = transform.position;
        var ray = Physics2D.Raycast(pos, direction, Mathf.Infinity, LayerMask.GetMask("Object"));

        if (ray.transform == null)
        {
            Debug.Log(pos + " / " + direction);
            return;
        }


        end = ray.point;

        _light.positionCount = 2;
        _light.SetPositions(new [] { pos, (Vector3)end });
        var realColor = new Color(color.HasFlag(LaserInfo.ColorCode.Red) ? 1 : 0,
                                  color.HasFlag(LaserInfo.ColorCode.Green) ? 1 : 0,
                                  color.HasFlag(LaserInfo.ColorCode.Blue) ? 1 : 0);

        _light.startColor = realColor;
        _light.endColor   = realColor;

        var prevNormalDir = normalDir;

        normalDir = ray.normal;

        var prevReflectionDir = reflectionDir;

        reflectionDir = Vector2.Reflect(direction, normalDir);

        var prevHitObj = hitObj?hitObj:null;

        hitObj = ray.transform.gameObject;
        //이전에 어떤 오브젝트와도 충돌하지 않은 경우 or 이전과 다른 오브젝트와 충돌한 경우 or 법선 방향이 달라진 경우
        if (prevHitObj == null || !prevHitObj.Equals(hitObj) || prevReflectionDir != reflectionDir)
        {
            if (prevHitObj != null && ConvertNormal(prevNormalDir) != LaserInfo.BlockFace.None)
            {
                var prevBlock = prevHitObj.GetComponent <BlockMove>();
                prevBlock.laserInfo.RemoveLaserInfoOnFace(ConvertNormal(prevNormalDir), color);
            }
            var block = hitObj.GetComponent <BlockMove>();
            block.laserInfo.AddLaserInfoOnFace(ConvertNormal(normalDir), color);

            foreach (var laser in _subLasers)
            {
                laser.Destroy();
            }
            _subLasers.Clear();
            if (hitObj.CompareTag("Mirror"))
            {
                var reflectiveColor = hitObj.GetComponent <BlockColor>().hasColor;
                var laser           = CreateLaser(pos, Vector2.Reflect(direction, ray.normal), reflectiveColor & color, this);
                laser.UpdateLaser();
            }
            else if (hitObj.CompareTag("Glass"))
            {
                var transmissiveColor = hitObj.GetComponent <BlockColor>().hasColor;
                var transmissiveLaser = CreateLaser(pos, direction, color & transmissiveColor, this);
                transmissiveLaser.UpdateLaser();
            }
        }
        else
        {
            foreach (var laser in _subLasers)
            {
                laser.UpdateLaser();
            }
        }
    }