二维码扫描效果

作者:追风剑情 发布于:2021-7-13 15:50 分类:Unity3d

工程截图

22222.png

33333.png

QRScanLine.cs

using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// QR扫描线
/// </summary>
public class QRScanLine : MonoBehaviour
{
    [SerializeField]
    private RectTransform m_rectTransform;
    [SerializeField]
    private Image m_line;
    [SerializeField]
    private float m_speed = 10;//扫描速度
    [SerializeField]
    private float m_interval = 0.5f;//扫描间隔时间
    private float m_lineHeight;
    private float m_parentHeight;
    private float m_parentHeightQrt1;//四分之一
    private float m_parentHeightQrt3;//四分之三
    private float m_currentY = 0;
    private float m_pauseTime = 0;
    private bool m_pause = false;

    private void Awake()
    {
        if (m_rectTransform == null)
            m_rectTransform = this.GetComponent<RectTransform>();
        if (m_line == null)
            m_line = this.GetComponent<Image>();
        m_lineHeight = m_rectTransform.rect.height;
        RectTransform parentRT = transform.parent.GetComponent<RectTransform>();
        m_parentHeight = parentRT.rect.height;
        m_parentHeightQrt1 = m_parentHeight / 4;
        m_parentHeightQrt3 = m_parentHeightQrt1 * 3;
    }

    void Update()
    {
        if (m_pause)
        {
            m_pauseTime += Time.deltaTime;
            if (m_pauseTime >= m_interval)
                m_pause = false;
            return;
        }

        m_currentY += m_speed * Time.deltaTime;
        if (m_currentY > m_parentHeight + m_lineHeight)
        {
            m_pause = true;
            m_pauseTime = 0;
            m_currentY = -m_lineHeight;
        }

        float y = -m_currentY;
        float alpha = CalculateAlpha();
        SetYAlpha(y, alpha);
    }

    private void OnEnable()
    {
        m_currentY = -m_lineHeight;
        m_pauseTime = 0;
        m_pause = false;
    }

    //计算alpha
    private float CalculateAlpha()
    {
        float t = 0;
        if (m_currentY <= m_parentHeightQrt1)
        {
            t = m_currentY / m_parentHeightQrt1;
        }
        else if (m_currentY >= m_parentHeightQrt3)
        {
            t = (m_parentHeight + m_lineHeight - m_currentY) / m_parentHeightQrt1;
        }
        else
        {
            t = 1;
        }
        float alpha = Mathf.LerpUnclamped(0, 1, t);
        return alpha;
    }

    private void SetYAlpha(float y, float alpha)
    {
        m_rectTransform.anchoredPosition = new Vector2(0, y);
        Color color = m_line.color;
        color.a = alpha;
        m_line.color = color;
    }
}

运行效果

11111.gif

标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号