版权声明:本文为博主原创文章,转载请表明来源和网址。 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就开始了。