将对象移动到特定位置Unity 3D时出现问题

时间:2019-01-12 18:37:28

标签: c# unity3d

我有一个想要在单击时缓慢而平稳地移动到特定位置的对象,所以我使用了以下代码:

currpos = transform.position;
Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
Rigidbody.MovePosition(Vector3.Lerp(transform.position, NewPos, Time.deltaTime* MoveSpeed)) ;

我遇到的问题是,当MoveSpeed较低时,对象会移动一点并没有到达特定位置,而当增加MoveSpeed时,他会很快到达特定位置!你有什么建议吗?

4 个答案:

答案 0 :(得分:0)

  

公共静态Vector3 Lerp(Vector3 a,Vector3 b,浮点数t);

     

通过插值t在向量a和b之间进行插值。的   参数t被限制在[0,1]范围内。这是最常用的   沿着两条线之间的一条线找到一个点   端点。

正如Doc所说,这只是距离而不是距离。逻辑不对。

因此,可以对代码进行如下修改:

 currpos = transform.position;
 Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
 Vector3 Dir= (NewPos-transform.position).normalized;
 Vector3 velocity= Dir*MoveSpeed;
 Rigidbody.MovePosition(transform.position+velocity);

如果您坚持使用Lerp:

   currpos = transform.position;
   Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
   float dist= (NewPos-transform.position).magnitude;
   if(dist!=0)
   {
        Rigidbody.MovePosition(Vector3.Lerp(transform.position, NewPos, Time.deltaTime* MoveSpeed)) ;   
   }
   else
   {
           //do nothing new postion arrived
   }

答案 1 :(得分:0)

根据Rigidbody.MovePosition上的Unity3D documentation,您需要启用Rigidbody插值以在两个位置之间平滑过渡。也应该像下面这样在FixedUpdate中完成:

void FixedUpdate()
{
    rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
}

Rigidbody.MovePosition仅采用一个参数,即目标Vector3。您应该只指定目标点而不使用Lerping,因此请尝试以下操作:

Rigidbody.MovePosition(NewPos + Time.deltaTime * MoveSpeed);

然后在FixedUpdate中进行。另外:

  

如果刚体的isKinematic设置为false,则其工作方式将有所不同。它的工作方式类似于transform.position = newPosition,并传送对象(而不是平滑过渡)。

答案 2 :(得分:0)

每次调用Lerp函数时,它都会在2个Vector之间给出一个点,因此就像乌龟问题一样,它永远也不会达到目的。每次都会越来越慢。

您可以通过将行进速度固定为一个常数来消除这种现象,但是它看起来不像渐进式减速那样好。

此外,您也可以通过在物体离物体太近后停止它来消除这种行为(这就是我通常使用的方式)

还请注意,如果您想用代码为某物设置动画并希望它平滑,则必须在“更新”功能上对其进行计算。

所以代码可以像

void GoToTarget(){
    var currpos = transform.position;
    NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
    traveling = true;
}

void Update () {
    if (traveling){
        rigidbody.MovePosition(Vector3.Lerp(transform.position, NewPos, Time.deltaTime* MoveSpeed));
        if((transform.position-NewPos).magnitude < 0.1f){
            //Current position is too close to Target, teleport to target and stop
            transform.position = NewPos;
            traveling = false;
        }
    }
}

答案 3 :(得分:0)

而不是忍受,为什么不直接走向它?

currpos = transform.position;
Vector3 NewPos = new Vector3(- 10, currpos.y, currpos.z + 2);
var position = Vector3.MoveTowards(transform.position, NewPos, Time.deltaTime* MoveSpeed);
Rigidbody.MovePosition(position);