利用加速度转盘的实现

JavaScript实现幸运大转盘抽奖 该游戏由一个具有多个奖项的转盘组成,玩家点击按钮后,转盘旋转,并最终停止在一个奖项上。在这个函数中,我们首先计算转盘的下一个角度。如果旋转速度为0,则表示转盘停止旋转,我们更新转盘当前的角度,并将转盘停止在对应的角度上。在这个函数中,我们首先检查转盘是否正在旋转,如果是,则直接返回。然后,我们清除之前的旋转动画,并生成一个随机的旋转圈数。现在,当用户点击"开始抽奖"按钮时,转盘将开始旋转,并最终停止在一个奖项上。然后,我们定义了一些变量和常量来控制转盘的旋转行为,包括旋转角度、旋转速度、加速度等。 阅读详情

好久没做过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²)/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就开始了。

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

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²)/2s
        a = (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是0
                    a = 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;
    }
}

互动抽奖页面:使用jQuery实现转盘式抽奖效果 在本章节中,我们将介绍即将展开的 jQuery 抽奖案例的背景与目的。该案例旨在展示如何利用 jQuery 技术栈来创建一个互动性高、用户体验良好的在线抽奖活动。通过这个案例,我们不仅能够让读者了解基本的 jQuery 应用,还将深入探讨与抽奖功能相关的前端技术要点。 阅读详情

相关推荐

试验转盘与卡具设计与使用方法详解

本文还有配套的精品资源,点击获取 简介:本技术文档详细介绍了试验转盘和卡具的设计原理和使用方法,这些设备在各种物理测试中扮演着重要角色,用于确保产品在模拟真实条件下进行性能评估。转盘用于模拟旋转运动,测试耐用性和稳定性,而卡具则用于精确固定测试样本。文档涵盖了设备的设计要素,如结构稳定性、驱动系统、控制系统和安全机制,以及卡具的适应性、无损夹持、精度和易用性。此外,还提供了...

weixin_42602241的博客 1651

unity实现幸运大转盘(实战项目)

转盘抽奖模块在游戏日常开发中经常用到,本次就为大家分享一个实战项目中的转盘实现方式(本转盘为转盘动,中间指针不动,不过指针动也是和此demo大同小异。demo下载在文章末尾,欢迎大家下载使用)。 转盘示意图: 话不多说直接贴代码(所有的关键点在代码中都已经详细注释): using System.Collections; using System.Collections.Generic; usin...

A_Pro_Cat的博客 3450

Spring boot实现用户登录,转盘,并将获得的奖励记录数据库的功能

Spring boot实现用户登录,转盘,并将获得的奖励记录数据库的功能,可以实现用户登录,并且查看自己获得的奖励,和其他所有人获得的奖励等功能

Unity开始加速、中间匀速、最后减速

private float maxSpeed = 10f; // 最大速度 private float acceleration = 8f; // 加速度 private float deceleration = 8f; // 减速度

weixin_43780907的博客 1973

Roll转盘效果的实现

实现装盘效果。包含大图片的代码裁剪,图片位置的动画跟随等。

跑马灯抽奖Lua.zip

使用ToLua实现简单的跑马灯效果 随机函数刷新效果和json解析的逻辑代码

【Lua实现转盘抽奖】

4.有概率的旋转 两种概率方式。5.View层DoTween旋转。2.lua调用此方法实例图片。1.C#写个方法生成一圈。

m0_53759018的博客 439

Unity实现跑马灯抽奖效果

主要为大家详细介绍了Unity实现跑马灯抽奖效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

lua语言入门学习(四)项目初体验之抽奖转盘(1)

lua语言入门学习 今天前辈教我看了项目,感觉果然公司级的项目分工都比较严谨,很多东西都是略懂功能,但对于底层逻辑的实现并不清楚。 为了保护公司这个游戏具体实现功能上本身的隐私,日常代码分享中不会分享全部的函数代码,一般只会通过接口函数名来介绍。 文章目录lua语言入门学习前言一、初感二、研读1.抽奖转盘后端(1)取抽奖转盘玩家数据(2)发送抽奖转盘活动的状态2.抽奖转盘策划总结 前言 先来看看游戏的界面吧! 一、初感 说实在话,小时候并没有玩过这类游戏,如果非要说什么相似类别的可能就是魔域了,h5

qq_43108889的博客 3264

Mediapipe入门——搭建姿态检测模型并实时输出人体关节点3d坐标(2024.1.4更新)

Mediapipe入门,利用mediapipe搭建人体整体检测模型,并输出右手21个关节点的坐标;mp_holistic.Holistic函数理解,mp_holistic.Holistic.process函数理解;mp.solutions.drawing_utils.draw_landmarks函数理解;Mediapipe实时姿态估计,3d骨架铰接图,matplotlib和Mediapipe绘图

kalakalabala的博客 6万+

如何使用Calibre PERC抽出 点到点/p2p 电阻

@[TOC](如何使用Calibre PERC抽点到点(p2p)电阻) 一、前言 需要实现的功能是从gds中抽出net的点到点的电阻。如下图这样。 二、准备工作 lvs rule pex rule(必要时可以自己定义RC rule) gds p2p点的坐标 定义prode.defs 因为p2p的点是变化的,所以每次prode定义都要重新出,对应的perc rule也是根据每个p2p点的定义来的,perc rule也是每次都要重新出。如果需要可以写一个脚本自动出这些定义文件。 PROBE_POINTS

kobayashiyou的博客 1万+

cocos creator 实现转盘抽奖

1.在开发过程中,我们经常回有幸运抽奖的功能,那么这个到底怎么实现的呢?今天分享一个自己实现转盘的功能。

qq_40956352的博客 1762

香橙派5B-RK3588-NPU内核升级至0.9.8:RKLLM多模态部署实战

本文详细介绍了香橙派5B-RK3588设备NPU内核升级至0.9.8版本的完整流程,重点讲解了升级的必要性、两种升级方案(预编译包安装与自行编译内核)以及RKLLM SDK的安装配置。通过实战演示多模态模型转换与推理,显著提升AI计算性能,为嵌入式AI部署提供实用指南。

salt9的博客 1027

Unity中实现转盘抽奖效果(一)

记录Unity小功能实现

weixin_50702814的博客 672

保姆级教程:用Python和PyTorch复现PTB-XL心电信号分类论文(附完整代码)

本文提供了一份详细的PTB-XL心电信号分类教程,涵盖从数据预处理到模型优化的完整流程。通过PyTorch实现三种深度学习架构(Conv1D、SincNet和熵特征融合网络),并针对医疗AI特有的类别不平衡问题提供解决方案。教程包含可运行的代码示例,帮助开发者快速复现论文结果并应用于实际心电信号分析场景。

weixin_30555125的博客 405

pcie硬件时序分析实战(PHY层眼图测量)​

PCIe高速接口的信号完整性(SI)直接影响系统带宽和稳定性。其中,​。

xiaoheshang_123的博客 860

Cocos Creator(JavaScript)转盘抽奖

Cocos crearor(JavaScript)转盘抽奖

qq_14965517的博客 924

读懂ARM汇编程序,你只差这篇!保姆级教程(附完整示例剖析)!

ARM汇编中的符号、标号、伪操作有哪些?C语言和汇编语言如何混合编程?GNU ARM汇编和ARM汇编的区别有哪些?

车载系统攻城狮 1万+

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

详解与重构hyman《Android SurfaceView实战 打造抽奖转盘》作者:邵励治

Shaolizhi 的专栏 2332

论文翻译:2024 High-Confidence Computing A survey on large language model (LLM) security and privacy: The

大型语言模型(LLMs),如ChatGPT和Bard,已经彻底改变了自然语言理解和生成。它们具有深度语言理解能力、类似人类的文本生成能力、上下文意识和强大的问题解决技能,使它们在各个领域(例如搜索引擎、客户支持、翻译)中变得不可或缺。同时,LLMs也在安全领域获得了关注,揭示了安全漏洞并展示了它们在安全相关任务中的潜力。本文探讨了LLMs与安全性和隐私的交集。具体来说,我们研究了LLMs如何积极影响安全性和隐私,与它们使用相关的潜在风险和威胁,以及LLMs内部的固有漏洞。

CSPhD-winston的博客 1722

垂类大模型 研发方向与具体方案调研

领域知识库加上通用大模型,针对通用大模型见过的知识比较少的问题,利用向量数据库等方式根据问题在领域知识库中找到相关内容,再利用通用大模型强大的summarization和qa的能力生成回复,完成本次垂直大模型研发。目前很多企业希望将大模型的能力应用到企业内部当中,但很多通用大模型只是一个预训练模型,其所能回答的知识主要来源于互联网上公开的通用知识库,对于部分垂直领域和企业内部的私有知识库的问答,给出的回答。:垂类大模型的效果与底座性能息息相关,研发垂类大模型第一步就是确定开源大模型解决方案。

风吹落叶的博客 3331

U3D钟UGUI的抽奖转盘的简单做法(允许控制)

网上有很多抽奖转盘的帖子,基本实现方法就不赘述了 。在此说一下一个简便的 控制转盘落点的办法,即通过 计算 初速度 (随机一个加速度和多旋转的圈数)来控制这个转盘。首先,转盘就使用一个image图片给出。通过skinTrans.FindChild ()方法找到此转盘。后给出一个控制转盘结果的算法,如下:可以通过数学知识知道,当转盘停下时,有:路程 = 初速度*时间+加速度*时间*时间/2 (即物理...

weixin_41800814的博客 1872

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

如何判断两物体加速度相等_高考物理难重点:向心加速度专题解析

高中物理 向心加速度 定义任何做匀速圆周运动的物体的加速度都指向圆心,这个加速度叫向心加速度。注:并不是任何情况下,向心加速度的方向都是指向圆心。当物体做变速圆周运动时,向心加速度的一个分加速度指向圆心。方向:在匀速圆周运动中,始终指向圆心,始终与线速度的方向垂直。向心加速度只改变线速度的方向而非大小。所有做曲线运动的物体都有向心加速度,向心加速度反映线速度方向变化的快慢。向心加速度又叫法向加速度...

weixin_39771775的博客 1961

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

简单点击转动转盘到指定位置的demo

1.界面显示 2.转盘慢速转动,当点击转动按钮后,转盘加速转动(有加速度),转动一段时间后停留在指定的位置。 难点:如何给转盘一个加速?如何让转盘停留在指定的位置? 思路:转盘转动通过每一帧rotation++得到 加速的逻辑:使用tween动画将speed变大变小。 每一帧增加rotation的逻辑: 当速度达到了最大值,速度会逐渐减小。速度变化:0.5(自动转动的速度)...

qq_38932407的博客 2520

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

cocos2dx 圆盘抽奖_Cocos2D-X转盘游戏制作教程:博彩大转盘

现如今,我们的手机游戏随着时代发展越来越多样化,但是却有一些经典的转盘游戏或者是转盘抽奖模块一直保留了下来,这些游戏或者模块在游戏开发中是怎么制作的呢?让我们一起阅读一下本篇教程吧~博彩大转盘,转盘抽奖的小系统,这是一个很有意思的游戏模块,游戏中增加这样一些趣味的小模块,会增进玩家的粘性,每天都想来抽两把试试手气;我做的这个是个矩形风格的转盘,不是那种圆形的转盘,但是原理是相差不多的;首先准备一些...

weixin_39621860的博客 632

基于UniHiker开发板的iPod Classic复刻:Python实现虚拟转盘与音乐播放

在嵌入式开发与物联网应用中,Python因其简洁语法和丰富的库支持,成为硬件编程的热门选择。其事件驱动编程模型与状态机设计,是实现复杂交互逻辑的核心原理,能有效管理设备的多状态转换。这种技术方案在智能硬件、复古设备复刻等场景中极具价值,尤其适合需要将经典物理交互(如iPod的Click Wheel转盘)数字化重现的项目。本文以UniHiker开发板为平台,详细讲解如何利用Python的`pinpong`和`unihiker`库,通过**虚拟转盘算法**和**状态机设计**,在触摸屏上模拟实体转盘的操控感,并

weixin_34408717的博客 326
上一篇: unity反向椭圆遮罩shader
下一篇: 色彩随机线性变换
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值