我有一个空的游戏对象,里面充满了我所有的玩家组件,在其中是一个模型,当按下由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/

10-14 03:47