libGDX:如何实现游戏结束界面Continue按钮平滑上下移动?
实现游戏按钮平滑上下微动的核心思路
嘿,这个需求超实用的!游戏结束界面给「Continue」按钮加个平滑的上下往复动效,能悄悄提升界面的生动感,我给你拆解几个最常用的实现原理,不管你用Unity/Unreal这类引擎还是自己写原生代码都能套用:
1. 三角函数(正弦/余弦):最省心的平滑周期运动
这是最常用的方案,因为正弦曲线天生就是连续平滑的周期曲线,完美适配往复运动需求:
- 核心逻辑:
- 先记录按钮的初始Y坐标(比如叫
startY),这是运动的基准位置 - 定义两个关键参数:
amplitude:移动幅度(比如10-15像素,控制按钮上下动的距离,别太大不然晃眼)period:运动周期(比如1.5-3秒,控制动的快慢)
- 每一帧获取累计运行时间
timeElapsed(从按钮开始运动时算起的时间) - 计算当前Y坐标:
currentY = startY + amplitude * Math.Sin(timeElapsed * 2 * Math.PI / period) - 原理:Sin函数的输出始终在
-1到1之间,乘以幅度就得到上下偏移的范围;2*Math.PI/period是把时间转换成0到2π的弧度,保证运动刚好在设定的周期内完成一次往复,全程没有生硬的停顿或变速。
- 先记录按钮的初始Y坐标(比如叫
2. 缓动函数+插值:自定义动效手感
如果想要更有个性的动效(比如先慢后快再慢,甚至轻微弹跳),可以用缓动函数配合来回插值:
- 核心逻辑:
- 确定两个关键位置:按钮的初始位置
Y0,以及向上移动的终点位置Y1 = Y0 + amplitude - 设定一个循环周期(比如2秒),前1秒从
Y0移到Y1,后1秒从Y1移回Y0 - 计算当前在周期内的进度:
progress = (timeElapsed % period) / period - 用缓动函数处理进度,比如常用的EaseInOutSine(平滑的缓入缓出):
easedProgress = 0.5 * (1 - Math.Cos(progress * Math.PI)) - 根据进度插值坐标:如果
progress <= 0.5,就从Y0插值到Y1;如果progress > 0.5,就从Y1插值回Y0 - 拓展:换成
EaseOutBounce这类缓动函数,还能做出按钮轻微弹跳的效果,适合偏活泼风格的游戏。
- 确定两个关键位置:按钮的初始位置
3. 游戏引擎内置动画系统:零代码快速实现
如果你用Unity、Unreal这类引擎,直接用内置动画系统更省心:
- Unity:可以用
Animation组件创建动画剪辑,给按钮的Position属性加关键帧,把Y轴的运动曲线调成平滑的贝塞尔曲线,然后设置循环播放;也可以用DOTween/LeanTween这类插件,一行代码就能实现:DOTween.YMove(continueButton, startY+10, 1.5f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.InOutSine) - Unreal:打开Widget Animation编辑器,给按钮的位置属性添加关键帧,调整曲线为平滑模式,开启循环播放即可,全程可视化操作,不用写代码。
小提示
- 移动幅度别太大(建议10-20像素),周期控制在1.5-3秒之间,避免干扰玩家点击或者显得过于晃眼
- 可以加个交互判断:当玩家鼠标悬停在按钮上时,暂停运动并固定在初始位置,提升交互体验
内容的提问来源于stack exchange,提问作者Eron
相关产品推荐
相关产品推荐

