利用加速度转盘的实现

版权声明:本文为博主原创文章,转载请表明来源和网址。 https://blog.csdn.net/thinbug/article/details/88170506

好久没做过2D项目,今天做一个摇奖转盘,没多想做出来发现停下来很生硬。因为roll到的项目需要先出来,然后在转盘。研究了大半天,发现把加速度相关知识都还给老师了,再写个例子复习下,重温中学美好时光。代码就贴出来了,已备再次忘记。运行起来貌似没有错,运行线路也比较流畅。

突然想起我的八中初中物理老师,一个很好很优秀的老师,向他致敬 !

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//计算转盘的加速度方法
//by thinbug 2019.3
//这里为了直观看到表现,让一个盒子前进和刹车.调试好后可以把距离改成旋转
public class TBTurnAround : MonoBehaviour {

    //
    //加速度 a = (v - v0) / t
    //瞬时速度公式 v = v0 + at;
    //位移公式 x = vt +½at²;
    //平均速度 v = x / t = (v0 + v) / 2
    //导出公式 v²-v0²=2as
    //(单位均为国际单位,即a的单位为m/s²,x的单位为m,v的单位为m/s)
   
    float v1 = 100f;    //最快时候的速度
    float s1 = 170f;    //需要行进的距离,这个可以替换成转盘的角度localEulerAngles , 角度一直累加(减少),方向不同,不用考虑360的问题,Inspector面板显示的是360,实际值随着转动很大(很小).


    float s2 = 30f;     //开始制动停止的距离

    public int stat;
	void Start () {
        
	}

    Vector3 at = Vector3.zero;
    float btime = 0f;
    float t;
    float a;
    float pass;
    void Update ()
    {
        if (stat == 1)
        {
            Debug.Log("加速开始");
            //状态等于1的时候开始.
            btime = Time.time;
            stat = 2;

            //根据公式v²-v0²=2as计算出启动的加速度
            //a = (v²-v0²)/2s
            a = Mathf.Pow(v1, 2) / (2 * s1);
        }
        if (stat == 2)
        {
            //当前运行了多久,计算当时行走的距离
            t = Time.time - btime;
            pass = v1 * t + 0.5f * a * t * t; //S = 1/2 at^2;
            at.z = pass;

            

            if (pass > s1)
            {
                at.z = s1;
                transform.transform.position = at;
                Debug.Log("减速开始");
                stat = 3;
                btime = Time.time;
                
                //减速也是先计算刹车的加速度
                a = -Mathf.Pow(v1, 2) / (2 * s2);
                
                return;
            }
            transform.transform.position = at;
        }
        if (stat == 3)
        {

            t = Time.time - btime;
            pass = v1 * t + 0.5f * a * t * t;

            //这个计算下当时的速度,判断是否该停下来了.如果是负数.
            float atv = v1 + a * t;

            if (atv < 0f)
            {
                at.z = s1 + s2;
                transform.transform.position = at;
                stat = -1;
                Debug.Log("到了");
                return;
            }

            at.z = pass + s1;
            transform.transform.position = at;
        }
    }
}

在场景中拖动一个球,拖脚本上去,把变量stat改成1就开始了。

猜你喜欢

转载自blog.csdn.net/thinbug/article/details/88170506
今日推荐