美文网首页Unity 记录
unity 抽奖机滚动效果

unity 抽奖机滚动效果

作者: Clean_1306 | 来源:发表于2018-04-29 10:19 被阅读1442次

    废话:想这个效果怎么做,想了两天,被折磨了两天(主要是没转过弯想通思路),现在终于实现了,然后嘛~~~~~下面介绍思路:

    我使用的ugui实现的:1.所以先设置好格子的高度:如图:

    image

    2.在收到停下指令后,判断格子是否走满了一格的距离,没有则走满到一格的距离,有则不管
    以上就是大概思路。

    下面是绑定在每个格子上的脚本代码:

    public float height = 192;//一个格子的高度
    public int frequency = 3;//表示几次走完一格
    
    [HideInInspector]
    public bool revise = false;//是否进行位置修正  //在culunm类种进行设置为true,此脚本直负责设置为false;
    
    private float speed = 0 ;//1次调用移动方法移动的距离   
    private float distance = 0;//格子移动的距离  
    
    private Culumn parent;   //管理这个格子的列表的类,挂载在格子的父物体上
    public Culumn Parent
    {
        get { return parent; }
    }
    
    void Start()
    {
        speed = height / frequency;//表示几次调用走完一格的距离
        parent = GameManager.Instance.GetCulumn(transform.parent.gameObject);
       
        
    }
    
    void FixedUpdate()//Fixed   //在fixedupdate中固定间隔调用,让速度看起来更均衡
    
    void Update   {
            Move();
        }
    
       void Move()
        {
            if (parent.isMove)
            {
                transform.localPosition += Vector3.down * moveSpeed * Time.deltaTime;
                distance += 1 * moveSpeed * Time.deltaTime;
                if (distance >= height)
                {
                    distance -= height;
                    transform.localPosition += new Vector3(0, distance, 0);
                    distance = 0;
                }
            }
            else if (revise)
            {
                if (distance != 0)
                {
                    distance = Mathf.Abs(distance - height);
                }
                StartCoroutine(SetPos(distance));
                distance = 0;
                revise = false;
                moveSpeed = speed;
            }
            ResetPos();
        }    
    
        /// <summary>
        /// 停止滚动后,用来停至每个格子处
        /// </summary>
        /// <param name="dis">还需要走满一格的距离</param>
        /// <returns></returns>
        IEnumerator SetPos(float dis)
        {
            if (dis != 0)
            {
                for (int i = 0; i < 5; i++)
                {
                    transform.localPosition -= new Vector3(0, dis / 5, 0);
                    yield return new WaitForFixedUpdate();
                }
            }
            StartCoroutine(UpDownAnim());//格子停下后的上下动画
        }
    
        /// <summary>
        /// 重置item的位置信息
        /// </summary>
        void ResetPos()
        {                                //最低位置和最高位置
            if (transform.localPosition.y <= -highPointY + 1)//+ 1
            {
                distance = 0;
                ResetSprite();
                transform.localPosition = new Vector3(0, highPointY, 0);
            }
        }
    

    以上就是每个格子的处理,这次我们主要说的是滚动效果,所以请读者主要看Move方法的代码.

    这里是每列的脚本:绑定在格子的父物体上

    public int culumnNum = 0;//表示这是第几列
    public float stopTime = 2f;//每列停止的时间
    
    public bool isMove = false;//表示该列是否滚动
    
    private ItemMove[] child = new ItemMove[5];//每列下的格子,我设置的是每列一共五个格子,四个处于屏幕中
    
    private void Start()
    {
        for (int i = 0; i < child.Length; i++)
        {
            child[i] = GameManager.Instance.GetItemMove(transform.GetChild(i).gameObject);
        }
    
    }
    
    private void Update()
    {
        //RandomPriceClick();
    }
    
    void RandomPriceClick()
    {
        //Input.GetMouseButton(0)
        if (Input.GetMouseButtonDown(0)&& !GameManager.Instance.isBusy)//GameManager.Instance.isBusy是一个bool值,表示该局游戏是否进行中
        {
            isMove = true;
            GameManager.Instance.StartBusyTimr();//开启 GameManager中的协程,控制isbusy;类似下面的stopmove
            StartCoroutine(StopMove());
        }
    }
    IEnumerator StopMove()//该列滚动的时间
    {
        yield return new WaitForSeconds(stopTime);
        isMove = false;
        for (int i = 0; i < child.Length; i++)
        {
                child[i].revise = true;
        }
    }
    

    好了,完成以上代码,基本上就能滚动了。

    下面是unity种hierarchy视图中的层级关系

    列.png
    格子.png

    做完这些,就能滚动了。
    然后实现后的效果,迟点更新,我还没研究透怎么上传gif232333333

    补充:
    1.上面的只是介绍了如何滚动,和停止,并没有介绍到如何停止到想要的结果,所以我会在评论区补上一个工程的百度云连接,补充上!!!如何停止到想要的结果(滚动,停止,切停止到想要的结果都在里面的了)!!!。代码解释我就不放上来了,大家自行下载吧。

    相关文章

      网友评论

        本文标题:unity 抽奖机滚动效果

        本文链接:https://www.haomeiwen.com/subject/qgdolftx.html