我有一个空的游戏对象,里面充满了我所有的玩家组件,在其中是一个模型,当按下由GetButtonDown实例化的控件时,该模型会对其自身进行动画处理。当前,玩家游戏对象中的所有内容都会立即移动到下一个点(基本上是在没有过渡的情况下传送到该点)。有没有办法让我将所有内容移动超过1秒钟而不是立即到达那里?这是GetButtonDown发生的情况
if (Input.GetButtonDown ("VerticalFwd"))
{
amountToMove.y = 1f;
transform.Translate (amountToMove);
}
我已经尝试过transform.Translate(amountToMove * Time.deltaTime * randomint);
以及各种使用时间的方式
但是,即使这似乎是最合逻辑的方式,也似乎不起作用。我猜是因为GetButtonDown仅在按下时“运行”,并且没有更新功能来“计时”每一帧的移动?有任何想法吗?
amountToMove也保存为Vector3。
最佳答案
试试.Lerp,它作为协程在某个时间量上插入一个值Vector3.Lerp(Vector3开始,Vector3结束,浮动时间)
请参阅文档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:如果Distance为1x.1y.1z,并且time.deltatime为.1且Movetime为1。
仅供参考:transform.Translate就像一个奇特的.position + =,因此您可以互换使用它们
编辑
这里有一些解决方案
简单 ::
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);
}
困难,可能不必要:
编写一个协程,为您的特定应用程序进行线性插值See documentation here
关于c# - Unity 3D在GetButtonDown上的特定时间内移动对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20672170/