我有一个空的游戏对象,里面装满了我所有的玩家组件,其中有一个模型,当按下控件时,它会通过GetButtonDown实例化来激活自己。目前,玩家游戏对象中的所有内容都会立即移动到下一个点(基本上是在没有过渡的情况下传送)。有没有办法我可以把它全部移过1秒而不是立刻去那里?以下是GetButtonDown上发生的事情
if (Input.GetButtonDown ("VerticalFwd"))
{
amountToMove.y = 1f;
transform.Translate (amountToMove);
}
我尝试过transform.Translate(amountToMove * Time.deltaTime * randomint); 以及各种使用时间的方法 然而,即使这似乎是最合乎逻辑的方式,这似乎也不起作用。我猜是因为GetButtonDown只在按下时“运行”并且没有更新功能来“移动”每帧移动?有任何想法吗? amountToMove也保存为Vector3。
答案 0 :(得分:1)
第一个公式错了。正确的公式是:
this.transform.position += (Distance/MoveTime) * time.deltatime
答案 1 :(得分:0)
尝试.Lerp,它作为协程运行,在一段时间内内插一个值 Vector3.Lerp(Vector3 start,Vector3 end,float time)
请参阅文档here
这应该让你大致了解最新情况
Vector3 Distance = End - Start;
// this will return the difference
this.transform.position += Distance/time.deltatime * Movetime
// this divides the Distance equal to the time.deltatime.. (Use Movetime to make the movement take more or less then 1 second
IE:如果距离是1x.1y.1z,而time.deltatime是.1,Movetime是1 ....你得到每个刻度的.1xyz移动,花费1秒到达终点
FYI:transform.Translate是一个花哨的.position + =,为此你可以互换地使用它们
修改强> 以下是一些解决方案
Easy ::
Vector3 amountToMove = new Vector3(0,1,0); // Vector3.up is short hand for (0,1,0) if you want to use that instead
if (Input.GetButtonDown ("VerticalFwd"))
{
transform.position = Vector3.Lerp(transform.position ,transform.position + amountToMove, 1);
}
很难而且可能没必要::
编写一个Coroutine,为您的特定应用See documentation here
执行一种线性插值