c# - 如何在使用 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;
}
}
}
}
解决方案
我们需要在移动之前创建一个字段来存储比例
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;
}
}
}
推荐阅读
- c++ - 使用未来的wait_for时无法检查成员变量,但如果我在线程中睡眠,它可以工作
- javascript - JavaScript中的0/1和真/假有什么区别
- sas - 带有 M 修饰符的 %SCAN 给出不正确的结果
- postgresql - 在JOOQ中获取两个日期的差的总和
- c++ - QWidget 及其子 Widget 中的 Tab 键顺序
- classification - ValueError:分类指标无法处理未知目标和多类目标的混合
- r - 如何简化下面的替换代码
- css - Chrome css修复了伪元素的定位不起作用
- sql - SQL“','附近的语法不正确”
- django - 如果 form.is_valid 测试视图的最聪明方法?