• NGUI 摇奖滚轮


    效果图:

      

      

    优缺点:

      优点:

      1.一条曲线完美解决旋转问题

      2. 解决了超速的问题,现在速度再快也不会乱了

      3.快速停止的时候进行了进度区分,后面的会等前面的停了再停

      缺点:

      1.停止节奏上会有细微差距,导致音频节奏不好,可以通过其他方式解决

    代码结构:

    简述:

      ScrollElement:控制元素的图片切换,并记录自己是第几个进入Rect的号码

      ScrollRect: 负责管理自己的旋转状态、曲线,堆排序等

      (堆排序的目的是 单帧没办法判断有多少个元素从底部到达了顶部,这些元素都需要从列表中拿元素值,为了保证数据顺序,需要进行一次排序)

      ScrollManager: 管理所有ScrollRect,并且与其他模块接口

    代码:

    /***************************************
    Editor: Tason
    Version: v1.0
    Last Edit Date: 2018-XX-XX 
    Tel: 328791554@qq.com
    Function Doc: 
    旋转元素
    ***************************************/
    
    using UnityEngine;
    
    namespace DYHT
    {
        public class MyScrollRectElement : MonoBehaviour
        {
            //入队列的序号
            private int m_realIndex;
            public int RealIndex
            {
                get { return m_realIndex; }
                set { m_realIndex = value; }
            }
    
            //当前序号
            public int m_currentElementId;
    
            public UISprite m_sprite;
    
            public string[] m_spritesNameList;
    
            //打开第几组图片
            public void SetDisplayID(int _id)
            {
                //安全校验
                if (_id < 0 || _id > m_spritesNameList.Length - 1)
                    return;
    
                m_currentElementId = _id;
    
    
                m_sprite.spriteName = m_spritesNameList[_id];
            }
        }
    }
    View Code
    /***************************************
    Editor: Tason
    Version: v1.1
    Last Edit Date: 2018-XX-XX 
    Tel: 328791554@qq.com
    Function Doc: 
    执行顺序
    
    注意:
    1.速度参数不要超过目标帧数,速度不要过快,就是1帧m_offsetValue 变化量不能超过1,按照30帧算 就是
    0.0333f * scrollSpeed  < 1 所以 scroll speed 就要小于30。 
    2.元素个数请务必保持偶数!!
    3.位置曲线的 末节点 Key-Value值 Key(0.9999)Value(1) 
    
     *       ┌-┐       ┌-┐
     *   ┌--┘ ┴-------┘ ┴--┐~~
     *   │          神         │ ~~
     *   │         ---         │
     *   ████───████ │      ~~~~~
     *   │                     │
     *   │        /           │~~~
     *   │                     │
     *   └--┐         ┌------┘
     *       │         │                ~~~~~~
     *       │         │         ~~~       
     *       │         │                        ~~~
     *       │         └-----------------┐
     *       │                            │
     *       │                            ├-┐
     *       │                            ┌-┘
     *       │                            │
     *       └-┐  ┐  ┌-------┬--┐  ┌┘~~~~~~
     *          │ -┤ -┤       │ -┤ -┤~~~~~
     *          └--┴--┘       └--┴--┘
     *                神兽保佑
     *               代码无BUG!
    ***************************************/
    
    using UnityEngine;
    using System.Collections.Generic;
    
    namespace DYHT
    {
        public class MyScrollRect : MonoBehaviour
        {
            #region Variable
    
            //滚动的n个阶段   
            [System.Serializable]
            public enum ScrollState
            {
                Init,               //初始化
                Idle,               //空闲
                StartAni,           //起步动画阶段 
                AddAndKeep,         //加速&保持最高速阶段
                ReduceSpeed,        //减速阶段
                SetFinal,           //设置最终显示值阶段
                EndAni,             //最终动画播放阶段
            }
            [Header("显示部分")]
            public ScrollState m_currentState;
    
            //当前旋转器序号
            public int m_index;
    
            //动画结束委托
            public delegate void EndScrollCallBack(int _index);
            public EndScrollCallBack endScrollCallBack;
    
            //一条位移曲线 “     的曲线”
            [Header("可调参数")]
            public AnimationCurve m_positionCurve;
    
            //模拟列表
            private List<int> m_simulationList;
    
            //最终选择列表
            private List<int> m_finialList;
    
            //元素个数(必须为偶数且大于等于2)
            public int m_elementCount = 4;
    
            //模拟的元素个数
            public int m_simulationCount = 16;
    
            //模拟列表下标计数
            private int m_simulationTempIndex;
    
            //总高度
            private float m_verticalLength;
    
            //卡片的实际间隔
            public float m_cellInterval = 120;
    
            //起始位置
            private float m_startPosition;
    
            //当前偏移值
            private float m_offsetValue;
    
            //取号序列记录
            private int m_keepScrollTemp;
    
            //目标值
            private float m_targetValue;
    
            //一条加速度曲线 末尾一定要是1
            public AnimationCurve m_scrollAddSpeedCurve;
    
            //当前速度 - 最大速度 - 最小速度 - 耗时 - 计时器 - 减速阶段目标速度
            public float m_currentSpeed = 0;
            public float m_maxSpeed = 5;
            public float m_minSpeed = 1;
            public float m_addSpeedTime = 0.6f;
            public float m_subSpeedTime = 0.6f;
            private float m_addTimer = 0;
            private float m_subTimer = 0;
    
            //元素间曲线间隔
            private float m_curvalInterval;
    
            //最终展示的图片索引
            private List<int> m_finalDisplayArray;
    
            //设置初始播放阶段动画偏移值 - 曲线 - 总时间 - 计时器 - 目标值 - 原值
            public float m_startOffsetValue = 0.15f;
            public AnimationCurve m_startAniCurve;
            public float m_startAniTime = 0.1f;
            private float m_startAniTimer = 0;
            private float m_startTargetValue;
            private float m_startOrginalValue;
    
            //设置最终播放阶段动画偏移值 - 曲线 - 总时间 - 计时器 - 目标值 - 原值
            public float m_finialOffsetValue = 0.1f;
            public AnimationCurve m_finialAniCurve;
            public float m_finialAniTime = 0.3f;
            private float m_finialAniTimer = 0;
            private float m_finialTargetValue;
            private float m_finialOrginalValue;
    
    
            //开始动画结束后进入速停的标记
            private bool m_isStartEndToQuickStop = false;
    
            #endregion
    
            #region Quote
    
            //最大堆
            private MaxHeap<MyScrollRectElement> m_maxHeap;
    
            //存放的元素
            [HideInInspector]
            public List<MyScrollRectElement> m_elements;
    
            #endregion
    
            #region SystemFunction
            private void Awake()
            {
                //开堆
                m_elements          = new List<MyScrollRectElement>();
                m_finalDisplayArray = new List<int>();
                m_simulationList    = new List<int>();
                m_finialList        = new List<int>();
                m_maxHeap           = new MaxHeap<MyScrollRectElement>(JudgeFunc0);
                //m_sortElements      = new List<MyScrollRectElement>();
            }
            
            void Update()
            {
                float temp;
                switch (m_currentState)
                {
                    case ScrollState.StartAni:
                        if (m_startAniTimer + Time.deltaTime >= m_startAniTime)
                        {
                            m_offsetValue = m_startTargetValue;
                            ChangePosition();
                            m_currentState = ScrollState.AddAndKeep;
                            m_currentSpeed = 0;
                            m_addTimer = 0;
                        }
                        else
                        {
                            m_startAniTimer += Time.deltaTime;
                            ChangePosition();
                        }
                        break;
                    case ScrollState.AddAndKeep:
                        if (m_currentSpeed < m_maxSpeed)
                        {
                            m_addTimer += Time.deltaTime;
                            m_currentSpeed = JWTools.Remap(0, m_addSpeedTime, 0, m_maxSpeed, m_addTimer);
                            m_currentSpeed = m_currentSpeed > m_maxSpeed ? m_maxSpeed : m_currentSpeed;
                        }
    
                        temp = Time.deltaTime * m_currentSpeed;
                        temp -= Mathf.Floor(temp);
                        m_offsetValue += temp;
                        ChangePosition();
    
                        if (m_isStartEndToQuickStop)
                        {
                            m_isStartEndToQuickStop = false;
                            StopScroll();
                        }
                        break;
                    case ScrollState.ReduceSpeed:
                        if (m_currentSpeed > m_minSpeed)
                        {
                            m_subTimer = (m_subTimer + Time.deltaTime) > m_subSpeedTime ? m_subSpeedTime : (m_subTimer + Time.deltaTime);
                            m_currentSpeed = JWTools.Remap(0, m_subSpeedTime, m_maxSpeed, m_minSpeed, m_subTimer);
                            m_currentSpeed = m_currentSpeed < m_minSpeed ? m_minSpeed : m_currentSpeed;
                        }
                        else
                        {
                            StopScroll();
                        }
    
                        temp = Time.deltaTime * m_currentSpeed;
                        temp -= Mathf.Floor(temp);
                        m_offsetValue += temp;
    
                        m_offsetValue += Time.deltaTime * m_currentSpeed;
                        ChangePosition();
                        break;
                    case ScrollState.SetFinal:
                        temp = Time.deltaTime * m_currentSpeed;
                        temp -= Mathf.Floor(temp);
                        m_offsetValue += temp;
                        ChangePosition();
                        break;
                    case ScrollState.EndAni:
                        if (m_finialAniTimer + Time.deltaTime >= m_finialAniTime)
                        {
                            m_offsetValue = m_finialTargetValue;
                            ChangePosition();
                            m_currentState = ScrollState.Idle;
                            
                            if (endScrollCallBack != null)
                                endScrollCallBack(m_index);
                        }
                        else
                        {
                            m_finialAniTimer += Time.deltaTime;
                            ChangePosition();
                        }
                        break;
                    default:
                        break;
                }
            }
    
            #endregion
    
            #region Other
            public void Init(int _index, IList<int> _l)
            {
                m_index = _index;
    
                //安全校验
                if (_l == null || _l.Count < m_elementCount || m_elementCount < 2)
                {
                    WDebug.WDebugLog("Error Initialization!");
                    return;
                }
    
                if (m_maxSpeed > Application.targetFrameRate)
                    WDebug.WDebugLog("Error : ScroolSpeed is too quick!");
    
                //变量初始化
                m_verticalLength = m_cellInterval * m_elementCount;
                m_curvalInterval = 1.0f / m_elementCount;
                m_offsetValue = 0f;
                m_startPosition = -m_elementCount / 2 * m_cellInterval;
                m_targetValue = 0;
                m_simulationTempIndex = 0;
                m_currentState = ScrollState.Init;
    
                //生成元素
                m_elements.Clear();
                for (int i = 0; i < m_elementCount; ++i)
                {
                    AddElements(i, _l[i]);
                }
    
                //添加模拟列表
                m_simulationList.Clear();
                for (int i = 0; i < m_simulationCount; ++i)
                {
                    m_simulationList.Add(Random.Range(0, Const_DYHT.m_elementCount));
                }
    
                //修正一次位置
                ChangePosition();
            }
    
            //设置元素 参0 当前序列编号 参1 初始图片下标
            public void AddElements(int _num, int _picIndex)
            {
                //对象池生成一个实例
                GameObject obj = JWABObjectPool.Instance.Spawn("ScrollElement") as GameObject;
                obj.name = string.Format("Select{0}", _num);
                obj.transform.SetParent(transform);
                obj.transform.localScale = Vector3.one;
                obj.transform.localPosition = new Vector3(0, 0, 0);
    
                obj.GetComponent<MyScrollRectElement>().SetDisplayID(_picIndex);
    
                //放入队列
                m_elements.Add(obj.transform.GetComponent<MyScrollRectElement>());
                obj.transform.GetComponent<MyScrollRectElement>().RealIndex = _num;
    
                //由于NGUI Panel关联的特性,还需要重新激活一次物体渲染
                obj.SetActive(false);
                obj.SetActive(true);
            }
    
            //修改位置 & 检测是否需要修正图片
            void ChangePosition()
            {
                switch (m_currentState)
                {
                    case ScrollState.Init:
                        for (int i = 0; i < m_elements.Count; ++i)
                        {
                            Vector3 nP = new Vector3(0, m_startPosition + m_positionCurve.Evaluate(m_offsetValue + (m_elements[i].RealIndex + 1) * m_curvalInterval) * m_verticalLength, 0);
                            m_elements[i].transform.localPosition = nP;
                        }
                        m_currentState = ScrollState.Idle;
                        break;
                    case ScrollState.StartAni:
                        //修正位置
                        for (int i = 0; i < m_elements.Count; ++i)
                        {
                            if (m_startAniTime != 0)
                                m_offsetValue = Mathf.Lerp(m_startOrginalValue, m_startTargetValue, m_startAniCurve.Evaluate(m_startAniTimer / m_startAniTime));
                            else
                                m_offsetValue = m_startTargetValue;
                            m_elements[i].transform.localPosition = new Vector3(0, m_startPosition + m_positionCurve.Evaluate(m_offsetValue + (m_elements[i].RealIndex + 1) * m_curvalInterval) * m_verticalLength, 0);
                        }
                        break;
                    case ScrollState.ReduceSpeed:
                        //修正位置
                        for (int i = 0; i < m_elements.Count; ++i)
                        {
                            Vector3 nP = new Vector3(0, m_startPosition + m_positionCurve.Evaluate(m_offsetValue + (m_elements[i].RealIndex + 1) * m_curvalInterval) * m_verticalLength, 0);
                            m_elements[i].transform.localPosition = nP;
                        }
                        break;
                  
                    case ScrollState.AddAndKeep:
                    case ScrollState.SetFinal:
                        //是否需要修正值
                        bool correctValueFlag = false;
    
                        //引入最大堆排序 Step0 清空最大堆
                        m_maxHeap.Clear();
    
                        //修正位置
                        for (int i = 0; i < m_elements.Count; ++i)
                        {
                            Vector3 nP = new Vector3(0, m_startPosition + m_positionCurve.Evaluate(m_offsetValue + (m_elements[i].RealIndex + 1) * m_curvalInterval) * m_verticalLength, 0);
    
                            //逻辑判断(★★★)
                            if (nP.y > m_elements[i].transform.localPosition.y)
                            {
                                //入堆前设置当前值
                                m_elements[i].transform.localPosition = nP;
                                if (m_currentState == ScrollState.AddAndKeep)
                                {
                                    //切换图片
                                    if (m_simulationList.Count > 0)
                                    {
                                        int n = (m_simulationTempIndex++) % m_simulationList.Count;
    
                                        m_elements[i].SetDisplayID(m_simulationList[n]);
                                    }
                                    else
                                        WDebug.WDebugLog("Error!");
                                }
                                else if (m_currentState == ScrollState.SetFinal)
                                {
                                    //入堆
                                    m_maxHeap.Push(m_elements[i]);
                                }
                            }
                            else
                                m_elements[i].transform.localPosition = nP;
                        }
    
                        //最大堆排序
                        while (m_maxHeap.Size > 0 && m_keepScrollTemp > 0)
                        {
                            //Debug.Log(m_index + "-" + m_keepScrollTemp + " ---> " + m_offsetValue + "");
                            if (m_keepScrollTemp > 1)
                            {
                                m_maxHeap.Pop().SetDisplayID(m_finialList[m_finialList.Count - m_keepScrollTemp--]);
                            }
                            else
                            {
                                m_maxHeap.Pop().SetDisplayID(m_finialList[m_finialList.Count - m_keepScrollTemp--]);
    
                                //修正位置 多向下走1/4的曲线距离
                                m_offsetValue -= m_offsetValue % m_curvalInterval + m_curvalInterval * m_maxHeap.Size - m_finialOffsetValue * m_curvalInterval;
                                //Debug.Log(m_index + " !!!! " + m_offsetValue);
    
                                //记录位置 准备最后一段动画
                                m_currentState = ScrollState.EndAni;
                                m_finialAniTimer = 0;
                                m_finialTargetValue = m_offsetValue - m_finialOffsetValue * m_curvalInterval;
                                m_finialOrginalValue = m_offsetValue;
    
                                //值修正
                                correctValueFlag = true;
                            }
                        }
                        //值修正
                        if (correctValueFlag)
                        {
                            correctValueFlag = false;
                            for (int i = 0; i < m_elements.Count; ++i)
                            {
                                m_elements[i].transform.localPosition = new Vector3(0, m_startPosition + m_positionCurve.Evaluate(m_offsetValue + (m_elements[i].RealIndex + 1) * m_curvalInterval) * m_verticalLength, 0);
                            }
                        }
                        break;
                    case ScrollState.EndAni:
                        //修正位置
                        for (int i = 0; i < m_elements.Count; ++i)
                        {
                            if (m_finialAniTime != 0)
                                m_offsetValue = Mathf.Lerp(m_finialOrginalValue, m_finialTargetValue, m_finialAniCurve.Evaluate(m_finialAniTimer / m_finialAniTime));
                            else
                                m_offsetValue = m_finialTargetValue;
                            m_elements[i].transform.localPosition = new Vector3(0, m_startPosition + m_positionCurve.Evaluate(m_offsetValue + (m_elements[i].RealIndex + 1) * m_curvalInterval) * m_verticalLength, 0);
                        }
                        break;
                }
            }
    
            //设置最终List
            public void SetFinalList(List<int> _l)
            {
                m_finialList.Clear();
                for (int i = 0; i < _l.Count; ++i)
                    m_finialList.Add(_l[i]);
            }
    
            //更新模拟列表 
            public void SetSimulationList(List<int> _l)
            {
                m_simulationList.Clear();
                for (int i = 0; i < _l.Count; ++i)
                {
                    m_simulationList.Add(_l[i]);
                }
            }
    
            //开始旋转
            public void StartScroll()
            {
                //状态修改
                m_currentState = ScrollState.StartAni;
    
                //参数设置
                m_startAniTimer = 0;
                m_startOrginalValue = m_offsetValue;
                m_startTargetValue = m_startOrginalValue - m_startOffsetValue * m_curvalInterval;
            }
            //停止旋转
            public void StopScroll()
            {
                if (m_currentState == ScrollState.StartAni)
                {
                    m_isStartEndToQuickStop = true;
                }
                else if (m_currentState == ScrollState.AddAndKeep || m_currentState == ScrollState.ReduceSpeed)
                {
    
                    //参数设置
                    if (m_currentState == ScrollState.AddAndKeep)
                        m_currentSpeed = m_maxSpeed;
    
                    //状态修改
                    m_currentState = ScrollState.SetFinal;
    
                    m_addTimer = m_addSpeedTime;
                    m_keepScrollTemp = m_finialList.Count;
                }
                else if (m_currentState == ScrollState.SetFinal)
                {
                    m_currentSpeed = m_maxSpeed;
                }
            }
    
            //减速
            public void SubSpeed()
            {
                if (m_currentState == ScrollState.AddAndKeep)
                {
                    //状态修改
                    m_currentState = ScrollState.ReduceSpeed;
    
                    //参数设置
                    m_subTimer = 0;
                }
            }
    
            //最大堆比较方法
            private int JudgeFunc0(MyScrollRectElement e0, MyScrollRectElement e1)
            {
                if (e0.gameObject.transform.localPosition.y < e1.gameObject.transform.localPosition.y)
                    return 1;
                else if (e0.gameObject.transform.localPosition.y == e1.gameObject.transform.localPosition.y)
                    return 0;
                else
                    return -1;
            }
    
            //添加完成回调函数
            public void AddEndCallBackFunc(EndScrollCallBack _func)
            {
                endScrollCallBack += _func;
            }
    
            //清空完成回调
            public void ClearEndCallBackFunc()
            {
                endScrollCallBack = null;
            }
    
            ////排序后的元素 用于隐藏元素
            //List<MyScrollRectElement> m_sortElements;
    
            ////隐藏几个元素 (从上到下排列 先排序再隐藏!)
            //public void HideElementsPre()
            //{
            //    m_maxHeap.Clear();
    
            //    for (int i = 0; i < m_elements.Count; ++i)
            //        m_maxHeap.Push(m_elements[i]);
    
            //    m_sortElements.Clear();
    
            //    for (int i = 0; i < m_elements.Count; ++i)
            //    {
            //        m_sortElements.Add(m_maxHeap.Pop());
            //    }
            //}
    
            //public void HideElement(int _index)
            //{
            //    if (_index < 0 || _index > m_sortElements.Count - 1)
            //        return;
    
            //    m_sortElements[_index].gameObject.SetActive(false);
            //}
    
            ////打开所有元素
            //public void ShowElements()
            //{
            //    for (int i = 0; i < m_elements.Count; ++i)
            //        m_elements[i].gameObject.SetActive(true);
            //}
    
    
    
            #endregion
        }
    }
    View Code
    /***************************************
    Editor: Tason
    Version: v1.0
    Last Edit Date: 2018-XX-XX 
    Tel: 328791554@qq.com
    Function Doc: 
    旋转窗口管理器 
    ***************************************/
    
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    namespace DYHT
    {
        public class ScrollRectsManager : MonoBehaviour
        {
            #region variable
            [System.Serializable]
            public enum ScrollManagerState
            {
                Idle,       //停止状态
                Run,        //正常停止状态
                QuickStop   //快停
            }
            public ScrollManagerState m_currentState;
    
            //第几个在运行
            public int m_runIndex;
            #endregion
    
            #region Quote
    
            public MyScrollRect[] m_mr;
    
            #endregion
    
    
            #region Function
    
            private void Start()
            {
                //初始化
                List<int> temp = new List<int>();
                for (int i = 0; i < m_mr.Length; ++i)
                {
                    temp.Clear();
                    for (int n = 0; n < m_mr[0].m_elementCount; n++)
                    {
                        int r = Random.Range(0, Const_DYHT.m_elementCount);
                        temp.Add(r);
                    }
    
                    if (m_mr[i] != null)
                    {
                        m_mr[i].Init(i, temp);
                    }
                }
    
                //参数设置
                m_currentState = ScrollManagerState.Idle;
                m_runIndex = -1;
    
                //事件添加
                for (int i = 0; i < m_mr.Length; ++i)
                {
                    m_mr[i].ClearEndCallBackFunc();
                    m_mr[i].AddEndCallBackFunc(ReportState);
                }
            }
    
            //滚完回调
            public void ReportState(int _index)
            {
                if (_index == m_mr.Length - 1)
                {
                    m_currentState = ScrollManagerState.Idle;
                    m_runIndex = -1;
    
                    SceneService_DYHT.m_instance.m_bottomUIManager.OneTurnOver();
    
                    return;
                }
                else
                    m_runIndex = _index;
    
                if (m_currentState == ScrollManagerState.QuickStop)
                {
                    //关闭所有协程
                    StopAllCoroutines();
    
                    //后续滚轮开始速停
                    for (int i = _index + 1; i < m_mr.Length; ++i)
                        m_mr[i].StopScroll();
                }
            }
    
            #endregion
            //全部滚轮速停
            public void QuickStop()
            {
                if (m_currentState == ScrollManagerState.Run)
                {
                    m_currentState = ScrollManagerState.QuickStop;
                    if (m_runIndex == -1)
                    {
                        for (int i = 0; i < m_mr.Length; ++i)
                            m_mr[i].StopScroll();
                    }
                    else
                        m_mr[((m_runIndex + 1) > (m_mr.Length - 1)) ? m_mr.Length - 1 : m_runIndex + 1].StopScroll();
                }
            }
            
            //设置滚轮最终选项 
            public void SetFinialValue(List<int> _data)
            {
                if (_data.Count == 15)
                {
                    List<int> final0 = new List<int>();
                    List<int> final1 = new List<int>();
                    List<int> final2 = new List<int>();
                    List<int> final3 = new List<int>();
                    List<int> final4 = new List<int>();
                    
    
                    //这里注意顺序
                    final0.Add(_data[2]);   final0.Add(_data[1]);   final0.Add(_data[0]);   final0.Add(0);
                    final1.Add(_data[5]);   final1.Add(_data[4]);   final1.Add(_data[3]);   final1.Add(1);
                    final2.Add(_data[8]);   final2.Add(_data[7]);   final2.Add(_data[6]);   final2.Add(2);
                    final3.Add(_data[11]);  final3.Add(_data[10]);  final3.Add(_data[9]);   final3.Add(3);
                    final4.Add(_data[14]);  final4.Add(_data[13]);  final4.Add(_data[12]);  final4.Add(4);
    
    
                    m_mr[0].SetFinalList(final0);
                    m_mr[1].SetFinalList(final1);
                    m_mr[2].SetFinalList(final2);
                    m_mr[3].SetFinalList(final3);
                    m_mr[4].SetFinalList(final4);
                }
                else
                    WDebug.WDebugLog("Error DataLength");
            }
    
            //设置旋转
            private IEnumerator SetSub(float _time, int _index)
            {
                yield return new WaitForSeconds(_time);
                m_mr[_index].SubSpeed();
            }
    
            //协程慢停
            public void NormalStop(float _t)
            {
                StopAllCoroutines();
                StartCoroutine(RealNormalStop(_t));
            }
    
            //真.协程慢停
            private IEnumerator RealNormalStop(float _t)
            {
                yield return new WaitForSeconds(_t);
    
                if (m_currentState != ScrollManagerState.Run)
                    yield break;
                
                float m_intervalTime = 0.15f;
           
                for (int i = 0; i < m_mr.Length; ++i)
                {
                    StartCoroutine(SetSub(m_intervalTime * i, i));
                }
            }
    
            //全部滚轮开始旋转
            public void AllStartScroll()
            {
                StopAllCoroutines();
                if (m_currentState == ScrollManagerState.Idle)
                {
                    for (int i = 0; i < m_mr.Length; ++i)
                    {
                        m_mr[i].StartScroll();
                    }
    
                    m_currentState = ScrollManagerState.Run;
                    m_runIndex = -1;
                }
            }
        }
    }
    View Code

    资源索引:

      这个暂时不提供,有公司的美术资源和框架,后面离开公司以后再发上来

  • 相关阅读:
    从函数作用域和块级作用域看javascript的作用域链
    基于vue实现一个简单的MVVM框架(源码分析)
    发布-订阅模式
    希尔排序
    直接插入排序
    选择排序
    React Fiber源码分析 第三篇(异步状态)
    React Fiber源码分析 第二篇(同步模式)
    React Fiber源码分析 第一篇
    数据结构 之 树总结
  • 原文地址:https://www.cnblogs.com/jwv5/p/9512382.html
Copyright © 2020-2023  润新知