You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:09:41