美文网首页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