开始时:
void Start()
{
ControlPanel.KeyPressed += OnKeyPressed;
}
在按下OnKeyPressed:的情况下
private void OnKeyPressed(PressedKeyCode[] obj)
{
float tempY = 0;
float tempX = 0;
// stable forward
if (hMove.y > 0)
tempY = - Time.fixedDeltaTime;
else
if (hMove.y < 0)
tempY = Time.fixedDeltaTime;
// stable lurn
if (hMove.x > 0)
tempX = -Time.fixedDeltaTime;
else
if (hMove.x < 0)
tempX = Time.fixedDeltaTime;
foreach (var pressedKeyCode in obj)
{
switch (pressedKeyCode)
{
case PressedKeyCode.SpeedUpPressed:
EngineForce += 0.1f;
break;
case PressedKeyCode.SpeedDownPressed:
EngineForce -= 0.12f;
if (EngineForce < 0) EngineForce = 0;
break;
case PressedKeyCode.ForwardPressed:
if (IsOnGround) break;
tempY = Time.fixedDeltaTime;
break;
case PressedKeyCode.BackPressed:
if (IsOnGround) break;
tempY = -Time.fixedDeltaTime;
break;
case PressedKeyCode.LeftPressed:
if (IsOnGround) break;
tempX = -Time.fixedDeltaTime;
break;
case PressedKeyCode.RightPressed:
if (IsOnGround) break;
tempX = Time.fixedDeltaTime;
break;
case PressedKeyCode.TurnRightPressed:
{
if (IsOnGround) break;
var force = (turnForcePercent - Mathf.Abs(hMove.y)) * HelicopterModel.mass;
HelicopterModel.AddRelativeTorque(0f, force, 0);
}
break;
case PressedKeyCode.TurnLeftPressed:
{
if (IsOnGround) break;
var force = -(turnForcePercent - Mathf.Abs(hMove.y)) * HelicopterModel.mass;
HelicopterModel.AddRelativeTorque(0f, force, 0);
}
break;
case PressedKeyCode.BackToBase:
{
Vector3 direction = helicopterPlatform.transform.position - transform.position;
Quaternion toRotation = Quaternion.FromToRotation(transform.forward, direction);
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, lookAtSpeed * Time.time);
//transform.LookAt(helicopterPlatform.transform);
}
break;
}
}
hMove.x += tempX;
hMove.x = Mathf.Clamp(hMove.x, -1, 1);
hMove.y += tempY;
hMove.y = Mathf.Clamp(hMove.y, -1, 1);
}
我添加了最后一部分:
case PressedKeyCode.BackToBase:
{
Vector3 direction = helicopterPlatform.transform.position - transform.position;
Quaternion toRotation = Quaternion.FromToRotation(transform.forward, direction);
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, lookAtSpeed * Time.time);
//transform.LookAt(helicopterPlatform.transform);
}
break;
当我使用LookAt时,它工作得很好,但旋转有点太快了,这就是我如何使用LookAt:
transform.LookAt(helicopterPlatform.transform);
然后我决定使用方向,旋转和四元数。Lerp,但现在当我按下键代码B时,这是后退的键代码,它使物体(直升机(旋转,然后按它所面对的方向旋转回来,我需要在B上按多次,使它面向直升机平台旋转。
这是一个完整脚本的链接,有点长,所以我不确定是否应该把它放在我的问题中,所以我把它上传到了pastebin.com:https://pastebin.com/YDfbVkH6
Lerp的t
值不是速度值,而是点a和点B 之间的进度
来自Lerp上的文档:
t:用于在a和b之间插值的值。
这意味着如果你得到以下代码
Quaternion.Lerp(transform.rotation, toRotation, t);
当t = 0
时,lerp将返回存储在transform.rotation
中的任何内容,而当t = 1
时,它将返回toRotation
中的任何信息,t = 0.5f
将返回这些值之间的任何信息。对于0和1之间的任何值,依此类推。
文件中的时间如下所示:
此帧开始的时间(只读(。这是自游戏开始以来的时间(以秒为单位(。
所以你现在主要做的是:
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, lookAtSpeed * time since the start of the game);
正如您所看到的,在场景运行几秒钟后(取决于您的lookAtSpeed
(,该值将迅速超过1,这意味着它将始终返回toRotation
。
您想要的是使用协程将t
值从0缓慢地递增到1,看起来像这样,它将根据您的lookAtSpeed 从0缓慢递增到1
internal IEnumerator LerpToPosition()
{
lookAtSpeed = 2f;
float t = 0f;
while (t < 1f)
{
t += lookAtSpeed * Time.deltaTime;
transform.rotation = Quaternion.Lerp(transform.rotation, toRotation, t);
yield return waitFrame;
}
}