我有一个想要在单击时缓慢而平稳地移动到特定位置的对象,所以我使用了以下代码:
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时,他会很快到达特定位置!你有什么建议吗?
答案 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);