Unity如何用transform.localScale实现物体随时间循环缩放
Unity C#实现物体周期循环缩放
你要做的随时间往复放大缩小的循环动画,不需要手动写复杂的状态切换逻辑,直接用Unity内置的数学函数结合时间参数就能快速实现,30秒周期的效果可以直接参考下面的方案。
最简实现(推荐新手用)
用Mathf.PingPong方法自动生成0-1之间往复变化的数值,配合插值计算缩放值,代码量少不容易出错:
- 可以自由配置循环总时长、最小缩放尺寸、最大缩放尺寸
- 自动完成从最小到最大、再从最大回到最小的平滑循环
- 把脚本直接挂在需要做动画的cube物体上就能运行
using UnityEngine; public class CyclicScaler : MonoBehaviour { [Header("动画参数")] // 单次完整循环(放大+缩小)的总时长,单位秒 public float fullCycleTime = 30f; // 缩到最小时的尺寸 public Vector3 minSize = new Vector3(1f, 1f, 1f); // 放到最大时的尺寸 public Vector3 maxSize = new Vector3(2f, 2f, 2f); void Update() { // 计算随时间往复的0-1过渡值 float transitionValue = Mathf.PingPong(Time.time / fullCycleTime, 1f); // 在最小和最大尺寸之间做插值,赋值给localScale transform.localScale = Vector3.Lerp(minSize, maxSize, transitionValue); } }
效果调整技巧
- 如果想要两端慢、中间快的更自然的缓动效果,把过渡值计算的代码替换成下面这行即可:
float transitionValue = Mathf.SmoothStep(0f, 1f, Mathf.PingPong(Time.time / fullCycleTime, 1f)); - 如果需要暂停/播放动画,只要加一个
public bool isPlaying = true;的判断,在Update里先判断这个值为true时再执行缩放计算就行 - 调整
fullCycleTime的数值就能改循环速度,数值越小缩放越快,数值越大缩放越慢
注意:你之前写的直接给
transform.localScale赋固定值的代码,只会在执行的瞬间把物体尺寸改成固定值,不会产生动画,动画需要每帧根据当前时间计算对应的尺寸再赋值,才能看到连续的变化效果。
内容的提问来源于stack exchange,提问作者Frimehdi Abdeljalil
相关产品推荐
相关产品推荐

