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

Unity运行时Cube缩放过度放大且不流畅的解决咨询

问题分析与解决方案

你的两段代码存在两个核心问题:

  • 过度放大:直接将int类型的cubeSize作为localScale赋值,从40跳到41意味着Cube边长瞬间增加1单位,若你期望的是小幅度调整,这种整数步长会显得变化过大;同时如果createCube函数存在重复缩放逻辑,会进一步放大问题。
  • 缩放不流畅:在Update中直接将scale设置为目标值,没有过渡过程,导致视觉上的跳变卡顿。

1. 修正过度放大(参数定义与初始化)

首先明确cubeSize的定义:如果它代表Cube的目标边长,确保初始化时基于Unity原生1x1x1的Cube设置缩放,避免重复放大。

// 修正createCube逻辑,确保基于原生1单位Cube生成目标尺寸的物体
private GameObject createCube(string name, float targetSize)
{
    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube.name = name;
    // 原生Cube边长为1,scale设为targetSize即可得到对应边长的Cube
    cube.transform.localScale = new Vector3(targetSize, targetSize, targetSize);
    return cube;
}

同时将cubeSize改为float类型,支持Inspector输入小数(比如40.2、40.5),实现真正的小幅度调整。

2. 实现平滑缩放(帧插值过渡)

通过帧插值让Cube的scale逐步过渡到目标值,替代瞬间赋值的逻辑,保证缩放过程流畅。

方案一:线性插值(Lerp)

public float cubeSize = 40f; // 改为float支持小幅度微调
public float fontSize = 5f;
public bool syncSizes = false;
public float smoothSpeed = 5f; // 平滑速度,值越大过渡越快

private List<TextMeshProUGUI> textComponents = new List<TextMeshProUGUI>();
private const float MinFontSize = 10f;
private float MaxFontSize = 100f;

private float targetScale; // 缓存目标缩放值
private GameObject cube;

private void Awake()
{
    targetScale = cubeSize;
    MaxFontSize = cubeSize;
    cube = createCube("Cube", cubeSize);
}

void Update()
{
    // 检测cubeSize是否变化,更新目标缩放值(加阈值避免浮点精度问题)
    if (Mathf.Abs(cubeSize - targetScale) > 0.01f)
    {
        targetScale = cubeSize;
        MaxFontSize = cubeSize;
    }

    // 逐帧插值过渡到目标缩放
    cube.transform.localScale = Vector3.Lerp(
        cube.transform.localScale,
        new Vector3(targetScale, targetScale, targetScale),
        smoothSpeed * Time.deltaTime
    );
}

private GameObject createCube(string name, float targetSize)
{
    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube.name = name;
    cube.transform.localScale = new Vector3(targetSize, targetSize, targetSize);
    return cube;
}

方案二:阻尼平滑(SmoothDamp,更自然的过渡)

如果需要更柔和的加速/减速效果,改用Vector3.SmoothDamp:

public float cubeSize = 40f;
public float fontSize = 5f;
public bool syncSizes = false;
public float smoothTime = 0.1f; // 平滑时间,值越大过渡越慢

private List<TextMeshProUGUI> textComponents = new List<TextMeshProUGUI>();
private const float MinFontSize = 10f;
private float MaxFontSize = 100f;

private float targetScale;
private Vector3 scaleVelocity; // SmoothDamp的速度缓存
private GameObject cube;

private void Awake()
{
    targetScale = cubeSize;
    MaxFontSize = cubeSize;
    cube = createCube("Cube", cubeSize);
}

void Update()
{
    if (Mathf.Abs(cubeSize - targetScale) > 0.01f)
    {
        targetScale = cubeSize;
        MaxFontSize = cubeSize;
    }

    cube.transform.localScale = Vector3.SmoothDamp(
        cube.transform.localScale,
        new Vector3(targetScale, targetScale, targetScale),
        ref scaleVelocity,
        smoothTime
    );
}

private GameObject createCube(string name, float targetSize)
{
    GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
    cube.name = name;
    cube.transform.localScale = new Vector3(targetSize, targetSize, targetSize);
    return cube;
}

关键改进说明

  • 改用float类型的cubeSize,支持小数调整,实现真正的小幅度缩放。
  • 用插值逻辑替代瞬间赋值,结合Time.deltaTime保证缩放速度不受帧率影响。
  • 增加可调节的平滑参数,让你可以根据需求控制过渡快慢。

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:51:07