游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   随幻Kaller

Unity 实现大转盘 热度 3

个人分类: | 2018-6-7 18:14
标签:Unity
2 个评论 | 阅读 292 | 收藏 | 举报
本大转盘可能有些不简便 但是效果还可以
分为三个阶段 加速 匀速 减速
这里将要模拟的是转盘转动后 经过运动 最终奖品会停在最左边的位置(奖励当然是一开始就计算出来的 这里假设权重是平均的)
下面给出关键代码:

[code]phpcode:

    public Button btn_start_roll;
    public Button btn_stop_roll;

    GameObject wheel;//转盘

    [Header("Adjustable-----------------------------------------")]
    public float v = 5000.0f;//匀速过程中的速度
    public float a0 = 4000.0f;//加速过程中的加速度


    public int rollNumOnStage1 = 5;//匀速的时候转几圈
    public int rollNumOnStage2 = 50;//减速的时候转几圈

    List<ItemObject> itemObjList;

    //转盘是根据到最左边的指示牌进行给奖励
  public IEnumerator StartToRoll()
    {

        //假设概率都是一样的
        int itemNum = itemObjList.Count;
        int rand = UnityEngine.Random.Range(0, itemNum);
 

        //模拟从第 0 个 转到 第 2 个
        int currIndex = 0;
        int targetIndex = 2;

        targetIndex = (targetIndex + (int)(itemNum * 3.0f / 4.0f) - rand + itemNum) % itemNum;//因为最后是按照最左边给奖励 3.0f / 4.0f 是因为正常是 index = 0(初始化的时候在上边) 的物品转到奖品 然后在转到最左边 所以顺时针转到 3 / 4 圈



        float currV = 0.0f;
        float currT1 = 0.0f;

        //第一阶段 加速
        float angle = rollNumOnStage1 * 360 + (targetIndex - currIndex) * (360.0f / 16.0f);
        Quaternion preQua = Quaternion.Euler(0, 0, (targetIndex - currIndex) * (360.0f / 16.0f) + UnityEngine.Random.Range(-3.0f, 3.0f));
        
       // float t1 = (angle - v * v / (2 * a0) - v * v / (2 * a2)) / v;
        while (true)
        {

            wheel.transform.Rotate(0, 0, -currV * Time.deltaTime);
            currV += a0 * Time.deltaTime;

            if (currV >= v)
            {
                currV = v;
                break;
            }
            yield return null;
        }

        //第二阶段 匀速
        Debugx.Log("can stop");
        float currAngle = 0;
        btn_stop_roll.gameObject.SetActive(true);//现在可以停止
        while (true)
        {
            currAngle += currV * Time.deltaTime;
            wheel.transform.Rotate(0, 0, -currV * Time.deltaTime);
            currT1 += Time.deltaTime;
            if (currAngle >= 360 * rollNumOnStage1 )
            {
               
                break;
            }

            yield return null;

        }


        //第三阶段 减速
        btn_stop_roll.gameObject.SetActive(false);//减速阶段不能停止
        
        angle = Quaternion.FromToRotation(Vector3.up, wheel.transform.up).eulerAngles.z;

        float target = preQua.eulerAngles.z;

        //x 计算后为总行程
        float x = target + angle;
        x = x >= 360.0f ? x - 360.0f : x;
        Debugx.Log(x);
        x += rollNumOnStage2 * 360.0f;

        float a2 = currV * currV / (2 * x);
       
        float time = 0;
        while (true)
        {
            time += Time.deltaTime;
            currV += -a2 * Time.deltaTime;
            wheel.transform.Rotate(0, 0, -currV * Time.deltaTime);
            Debugx.Log("the currV is : " + currV);

            if (currV < 0)
            {
                Debugx.Log("end " + time);
                break;

            }

            yield return null;
        }

        btn_start_roll.gameObject.SetActive(true);


        //结束 给与相应的奖励
        Debugx.Log("the wheel rolls end... the reward is : " + itemObjList[rand].data.Remark);

    }

1 0

评论 (2 个评论)

回复 3084 2018-6-11 13:47
感谢分享   
回复 gartional 2018-6-12 23:45
收藏啦多谢
回复 越过山丘 2018-7-16 10:41
感谢分享

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号

个人分类

标签

阅读排行

评论排行

推荐博客

最新博客

返回顶部