首页 > 解决方案 > 如何在使用 Lerp 缓慢平滑移动的同时缩放变换?

问题描述

脚本中的目标是变换缓慢平滑地移动到另一个对象并成为该对象的子对象。这部分工作正常!我现在正在尝试使对象在移动时也缩小(缩小)。

我添加了第 67 行:

this.transform.localScale = Vector3.Lerp(transform.localScale, new Vector3(0.001f, 0.001f, 0.001f), timer);

但是变换在移动时不会缓慢平滑地缩放,在变换完成移动后开始缩放。我希望它在移动时缩放到 0.001。

其次,在缩放对象消失后,我在编辑器中看到 x、y、z 的缩放值:5e-05

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Manager : MonoBehaviour
{
    public enum TransitionState
    {
        None,
        MovingTowards,
        Transferring
    }

    public Transform player;
    public Transform carte;
    public Animation anim;
    public Transform destinationTransform;
    public float speed;
    public float distanceToStop;
    public float lerpTime;
    public UnlockCrate unlockCarte;

    private GameObject rig_f_middle;

    private Transform originTransform;
    private float timer;
    private bool openonce = false;

    private TransitionState state = TransitionState.MovingTowards;

    void Start()
    {
        rig_f_middle = GameObject.Find("rig_f_middle.02.R");
    }

    void Update()
    {
        var dist = Vector3.Distance(carte.position, player.position);


        if(dist < 1.5f)
        {
            if (openonce == false)
            {
                anim.Play("Crate_Open");
                openonce = true;
            }

            switch (state)
            {
                case TransitionState.MovingTowards:
                    var v = rig_f_middle.transform.position - transform.position;
                    if (v.magnitude < 0.001f)
                    {
                        state = TransitionState.Transferring;
                        originTransform = rig_f_middle.transform;
                        timer = 0;
                        return;
                    }
                    Vector3 moveDir = v.normalized;
                    transform.position += moveDir * speed * Time.deltaTime;
                    break;

                case TransitionState.Transferring:
                    timer += Time.deltaTime;
                    this.transform.position = Vector3.Lerp(originTransform.position, destinationTransform.position, timer);
                    this.transform.localScale = Vector3.Lerp(transform.localScale, new Vector3(0.001f, 0.001f, 0.001f), timer);
                    if (timer >= 1.0f)
                    {
                        this.transform.parent = destinationTransform;
                        state = TransitionState.None;
                        this.enabled = false;
                        return;
                    }
                    break;

                default:
                    this.enabled = false;
                    return;
            }
        }
    }
}

标签: c#unity3d

解决方案


我们需要在移动之前创建一个字段来存储比例

    private Vector3 initialScale;

然后在更新中,需要添加两行,这两行都被注释掉了。

    void Update()
    {
        var dist = Vector3.Distance(carte.position, player.position);

        if(dist < 1.5f)
        {
            if (openonce == false)
            {
                anim.Play("Crate_Open");
                openonce = true;
            }

            switch (state)
            {
                case TransitionState.MovingTowards:
                    var v = rig_f_middle.transform.position - transform.position;
                    if (v.magnitude < 0.001f)
                    {
                        state = TransitionState.Transferring;
                        originTransform = rig_f_middle.transform;
                        //recording the scale before moving
                        initialScale = transform.localScale; 
                        timer = 0;
                        return;
                    }
                    Vector3 moveDir = v.normalized;
                    transform.position += moveDir * speed * Time.deltaTime;
                    break;

                case TransitionState.Transferring:
                    timer += Time.deltaTime;
                    this.transform.position = Vector3.Lerp(originTransform.position, destinationTransform.position, timer);
                    // lerping from the initial to target scale
                    this.transform.localScale = Vector3.Lerp(initialScale, new Vector3(0.001f, 0.001f, 0.001f), timer); 
                    if (timer >= 1.0f)
                    {
                        this.transform.parent = destinationTransform;
                        state = TransitionState.None;
                        this.enabled = false;
                        return;
                    }
                    break;

                default:
                    this.enabled = false;
                    return;
            }
        }
    }

推荐阅读