Unity 3D在GetButtonDown上的特定时间内移动对象

时间:2013-12-19 02:03:26

标签: c# unity3d

我有一个空的游戏对象,里面装满了我所有的玩家组件,其中有一个模型,当按下控件时,它会通过GetButtonDown实例化来激活自己。目前,玩家游戏对象中的所有内容都会立即移动到下一个点(基本上是在没有过渡的情况下传送)。有没有办法我可以把它全部移过1秒而不是立刻去那里?以下是GetButtonDown上发生的事情

    if (Input.GetButtonDown ("VerticalFwd"))
    {

        amountToMove.y = 1f;
        transform.Translate (amountToMove);
    }

我尝试过transform.Translate(amountToMove * Time.deltaTime * randomint); 以及各种使用时间的方法 然而,即使这似乎是最合乎逻辑的方式,这似乎也不起作用。我猜是因为GetButtonDown只在按下时“运行”并且没有更新功能来“移动”每帧移动?有任何想法吗? amountToMove也保存为Vector3。

2 个答案:

答案 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

执行一种线性插值