好久没做过2D项目,今天做一个摇奖转盘,没多想做出来发现停下来很生硬。就模拟加速和减速,这里是距离,最后换成改变transform改变角度就好了。

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 = v0t +½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²)/2sa = 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就开始了。

补充:
多次使用到这个脚本,又进行了一些修改,改为一个静态函数,方便调用。下面是代码。

using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;public class MathFunction : MonoBehaviour
{////加速度 a = (v - v0) / t//瞬时速度公式 v = v0 + at;//位移公式 x = v0t +½at²;//平均速度 v = x / t = (v0 + v) / 2//导出公式 v²-v0²=2as//(单位均为国际单位,即a的单位为m/s²,x的单位为m,v的单位为m/s)//计算加速度方法//by thinbug 2022.9.16//这里为了直观看到表现,让一个盒子前进和刹车.//物理加速后进行减速/// <summary>/// /// </summary>/// <param name="initSpeed">初速度</param>/// <param name="accelerateMaxSpeed">加速到最高时候的速度</param>/// <param name="accelerateMaxDis">加速到最高时候到起点的距离</param>/// <param name="decelerateMaxDis">减速的最长距离</param>/// <param name="action">返回结果{是否结束,距离}</param>/// <param name="callbackFrameRate">返回的周期单位毫秒</param>/// <returns></returns>public static async Task PhysicsAccelerateDecelerate(float initSpeed = 50f, float accelerateMaxSpeed = 100f, float accelerateMaxDis = 100f, float decelerateMaxDis = 100f, UnityAction<bool,float> action = null, int callbackFrameRate = 50){int delaytime = (int)(1000f / callbackFrameRate);    //每帧的时间int state = 1;float btime = Time.time;float t;float a;float pass;float nowAt = 0f;//加速阶段//根据公式v²-v0²=2as计算出启动的加速度//a = (v²-v0²)/2sa = (Mathf.Pow(accelerateMaxSpeed, 2) - Mathf.Pow(initSpeed, 2)) / (2 * accelerateMaxDis);while (state > 0){action?.Invoke(false, nowAt);await Task.Delay(delaytime);if (state == 1){//当前运行了多久,计算当时行走的距离t = Time.time - btime;//瞬时速度公式 v = v0 + at;//位移公式 x = vt +½at²;//pass = accelerateMaxSpeed * t + 0.5f * a * t * t; //S = 1/2 at^2;pass = initSpeed * t + 0.5f * a * t * t; //S = 1/2 at^2;nowAt = pass;if (pass > accelerateMaxDis){nowAt = accelerateMaxDis;state= 2;btime = Time.time;//减速也是先计算刹车的加速度,vt是0a = 0-Mathf.Pow(accelerateMaxSpeed, 2) / (2 * decelerateMaxDis);}}else if (state == 2){t = Time.time - btime;pass = accelerateMaxSpeed * t + 0.5f * a * t * t;//这个计算下当时的速度,判断是否该停下来了.如果是负数.float atv = accelerateMaxSpeed + a * t;if (atv < 0f){nowAt = accelerateMaxDis + decelerateMaxDis;state = -1;}else{nowAt = pass + accelerateMaxDis;}}}action?.Invoke(true, nowAt);}//下面的是演示如何使用private async void OnEnable(){await PhysicsAccelerateDecelerate(initspd, addspd, dis1, dis2, test, 50);}public float initspd = 10f;public float addspd = 50f;public float dis1 = 100f;public float dis2 = 50f;void test(bool finish,float dis){Debug.Log("Finish:"+finish +" ,dis : "+dis);Vector3 at = transform.position;at.z = dis;transform.position = at;}
}

利用加速度转盘的实现相关推荐

  1. 【翻译】利用加速度求解位置的算法——三轴传感器

    cposture 一个小白的技术成长之路 [翻译]利用加速度求解位置的算法--三轴传感器 http://www.cnblogs.com/cposture/p/4378922.html 摘要      ...

  2. 利用加速度求解位置的算法——三轴传感器

    转载的一篇文章,跟自己做过的一个车载项目类似,也算是标记一下吧. ---------------------------------------分割线------------------------- ...

  3. Android移动开发-利用加速度传感器开发仿微信摇一摇功能的实现

    加速度传感器是最常见的传感器,大部分Android手机都内置了加速度传感器,加速度传感器运用最广泛的功能就是微信的摇一摇功能,用户通过摇晃手机寻找周围的人,其它类似的应用还摇骰子.玩游戏等. 下面以摇 ...

  4. 利用三轴加速度求解位移的算法—来自飞思卡尔方案

    在要求精度不高的情况,可以使用三轴加速度积分得到位移,飞思卡尔给出了官方方法,下文来自翻译说明 cache.freescale.com/files/senso- 摘要 此文档描述并使用MMA7260Q ...

  5. 详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》

    详解与重构hyman<Android SurfaceView实战 打造抽奖转盘> 作者:邵励治 一.概述--关于SurfaceView您不得不知道的二三事 1.SurfaceView是干什 ...

  6. C语言编码小球斜抛运动,利用C4droid绘制小球斜抛运动轨迹(考虑空气阻力)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我把源代码分享出来,欢迎有兴趣的朋友下载测试,修改优化. /*********************************************** ...

  7. 带你了解加速度传感器的几种应用

    加速度传感器是一种能够测量加速力的电子设备.加速力也就是当物体在加速过程中作用在物体上的力.加速度传感器有两种:一种是角加速度传感器,是由陀螺仪改进过来的.另一种就是线加速度传感器.它也可以按测量轴分 ...

  8. python加速度算位移_基于Labview的加速度两次积分求位移

    理论上讲,加速度的积分是速度,再积分便是位移.然而实际操作中这有很多不便,比如两次积分过程中,积分常量造成的线性漂移是很麻烦的.幸运的是,对于一些周期信号,比如有规律的振动信号,我们仍然是可以通过积分 ...

  9. 自绘动画android,(译)android利用Canvas和几何学绘制几何动画

    1 创建圆形动画 首先需要画一些同心圆,并添加动画将同心圆的半径逐渐增加,即从同心圆中心向四周扩散的动画. 需要定义一些属性包括:同心圆间隔.圆线颜色.圆线宽度: 1dp @color/black 1 ...

最新文章

  1. python经典程序练习题-99道经典练习题助你全面掌握python基础知识,附技巧答案...
  2. 银行营业网点管理系统——Servlet包(CityAreaServlet )
  3. 10个经典的爆炸化学反应,个个都是你惹不起的“暴脾气”
  4. 陌陌估值1亿美元:一个用户10美元,贵吗?
  5. 阿里巴巴测试相关内容
  6. Transformer又又来了,生成配有音乐的丝滑3D舞蹈,开放最大规模数据集AIST++
  7. findViewById报空指针异常
  8. [转]linux用户管理
  9. 前后端分离导出excel_Vue + .NetCore前后端分离的快速发开框架
  10. python的drop duplicates,Python的pandas中,drop_duplicates函数怎么根据索引来去重
  11. 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有纯滞后一阶惯性系统计算机控制系统设计.pdf...
  12. 【设计】同步降压型DC-DC转换器驱动电路设计
  13. 移动端后台管理系统框架
  14. 基于C#的图书管理系统
  15. word中事例和堆栈(大括号里面多行内容)怎么设置左对齐
  16. 飞思卡尔k66,k60无限重启
  17. h5调用指纹识别_HTML5 + JS 网站追踪技术:帆布指纹识别 Canvas FingerPrinting Universally Unique Identifier,简称UUID...
  18. .NET新手系列(九)
  19. GitLab安装到实战
  20. 相似度计算常用方法综述

热门文章

  1. 指针和指针变量的关系
  2. dede织梦html手机模板,dede织梦cms手机站模板制作和调用方法
  3. 《深入理解Java虚拟机》知识点目录
  4. 上海亚商投顾:A股三大指数涨跌不一 ChatGPT、机器人概念齐掀涨停潮
  5. 解决百度网盘二维码加载不出来问题
  6. 智能家居有必要HomeKit吗?
  7. AutoCAD语言包下载地址
  8. 应用zigbee实现智能家居项目
  9. 关于进一步加强高等学校计算机基础教学的意见,关于进一步加强和改进计算机基础课教学的意见...
  10. 利用vmware在自己的个人电脑上面搭建虚拟linux服务器