我在团结游戏中使用Vector3.Lerp来简单地将游戏对象从一个位置移动到另一个位置。以下是我的代码:
public class playermovement : MonoBehaviour {
public float timeTakenDuringLerp = 2f;
private bool _isLerping;
private Vector3 _startPosition;
private Vector3 _endPosition;
private float _timeStartedLerping;
void StartLerping(int i)
{
_isLerping = true;
_timeStartedLerping = Time.time ; // adding 1 to time.time here makes it wait for 1 sec before starting
//We set the start position to the current position, and the finish to 10 spaces in the 'forward' direction
_startPosition = transform.position;
_endPosition = new Vector3(transform.position.x + i,transform.position.y,transform.position.z);
}
void Update()
{
//When the user hits the spacebar, we start lerping
if(Input.GetKey(KeyCode.Space))
{
int i = 65;
StartLerping(i);
}
}
//We do the actual interpolation in FixedUpdate(), since we're dealing with a rigidbody
void FixedUpdate()
{
if(_isLerping)
{
//We want percentage = 0.0 when Time.time = _timeStartedLerping
//and percentage = 1.0 when Time.time = _timeStartedLerping + timeTakenDuringLerp
//In other words, we want to know what percentage of "timeTakenDuringLerp" the value
//"Time.time - _timeStartedLerping" is.
float timeSinceStarted = Time.time - _timeStartedLerping;
float percentageComplete = timeSinceStarted / timeTakenDuringLerp;
//Perform the actual lerping. Notice that the first two parameters will always be the same
//throughout a single lerp-processs (ie. they won't change until we hit the space-bar again
//to start another lerp)
transform.position = Vector3.Lerp (_startPosition, _endPosition, percentageComplete);
//When we've completed the lerp, we set _isLerping to false
if(percentageComplete >= 1.0f)
{
_isLerping = false;
}
}
}
}
代码工作正常,游戏对象在两点之间平滑移动。但到达目的地大约需要1秒。我想让它更快地移动。我试过减小float timeTakenDuringLerp的值,但速度没有受到影响。我已经关注this tutorial并且那里的解释也说改变timeTakenDuringLerp变量以便改变速度,但它在这里不起作用。
有什么建议吗?
答案 0 :(得分:2)
℮,谢谢你链接到我的博客!
减少timeTakenDuringLerp
是正确的解决方案。这减少了物体从开始到结束所需的时间,这是另一种说法“它会提高速度”。
如果有特定的速度,您希望对象移动,则需要将timeTakenDuringLerp
变为变量而不是常量,并将其设置为{{1} }。或者更好的是,不要使用distance/speed
,而是设置对象的Lerp
,让Unity的物理引擎处理它。
按照@Thalthanas的建议,将velocity
乘以常数不正确。这导致lerping更新在lerping完成后继续发生。它还使代码难以理解,因为percentageComplete
不再是在lerp期间所花费的时间。
我已经对我的代码进行了双重检查,确实有效,因此您遇到的问题必须在其他地方。或者你可能不小心增加时间,这会减少的速度?
答案 1 :(得分:0)
解决方案是
将percentageComplete
值乘以speed
值,例如
transform.position = Vector3.Lerp (_startPosition, _endPosition, percentageComplete*speed);
因此,当您增加speed
时,它会更快。