让玩家看向相对于相机统一的方向
Make players look direction relative to camera unity
我正在制作一个统一的第三人称角色控制器,我有一个带有方向和动画的玩家移动。我的问题是:如何使运动旋转相对于相机旋转
注意:
我 不是 使用 transform.translate 或任何类似的方法来移动玩家,我正在使用输入向量和 atan2 计算旋转,然后使用动画移动玩家。所以我不能只改变x方向和y方向,我只能改变y旋转
我当前的播放器外观代码
Vector3 CalculateRotation(float H, float V)
{
IsTurning = IsMoving(H, V);
if (IsTurning) {
angle = Mathf.RoundToInt(Mathf.Atan2(V, -H) * Mathf.Rad2Deg);
IsTurned = false;
ani.SetBool("isWalking", true);
return new Vector3(0, Mathf.RoundToInt(angle), 0);
}
else
{
ani.SetBool("isWalking", false);
}
return new Vector3(0, Mathf.RoundToInt(CurrentRotation.y), 0);
}
void LookTorwards(Vector3 T_Angle)
{
NewRotation = T_Angle - CurrentRotation;
NewRotation.y = Mathf.Repeat(NewRotation.y + 180f, 360f) - 180f;
if (NewRotation.y == 180)
{
NewRotation.y -= 1;
}
if (TargetRotation.y == CurrentRotation.y)
{
IsTurned = true;
return;
}
if (NewRotation.y > 0)
{
transform.Rotate(new Vector3(0, RotationSpeed, 0));
CurrentRotation.y += RotationSpeed;
}
else if (NewRotation.y < 0)
{
transform.Rotate(new Vector3(0, -RotationSpeed, 0));
CurrentRotation.y -= RotationSpeed;
}
}
我目前没有时间在Unity上测试,所以我给你一些伪代码来帮助你解决你的问题
// Get the direction of where the player should ahead in world space
Vector3 hMoveDir = cameraTransform.right * movementHorizontal;;
Vector3 vMoveDir= cameraTransform.forward * movementVertical;
Vector3 moveDir = hMoveDir + vMoveDir;
// Create the rotation we need according to moveDir
lookRotation = Quaternion.LookRotation(moveDir);
// Rotate player over time according to speed until we are in the required rotation
playerTransform.rotation = Quaternion.Slerp(playerTransform.rotation, lookRotation , Time.deltaTime * RotationSpeed);
我正在制作一个统一的第三人称角色控制器,我有一个带有方向和动画的玩家移动。我的问题是:如何使运动旋转相对于相机旋转
注意: 我 不是 使用 transform.translate 或任何类似的方法来移动玩家,我正在使用输入向量和 atan2 计算旋转,然后使用动画移动玩家。所以我不能只改变x方向和y方向,我只能改变y旋转
我当前的播放器外观代码
Vector3 CalculateRotation(float H, float V)
{
IsTurning = IsMoving(H, V);
if (IsTurning) {
angle = Mathf.RoundToInt(Mathf.Atan2(V, -H) * Mathf.Rad2Deg);
IsTurned = false;
ani.SetBool("isWalking", true);
return new Vector3(0, Mathf.RoundToInt(angle), 0);
}
else
{
ani.SetBool("isWalking", false);
}
return new Vector3(0, Mathf.RoundToInt(CurrentRotation.y), 0);
}
void LookTorwards(Vector3 T_Angle)
{
NewRotation = T_Angle - CurrentRotation;
NewRotation.y = Mathf.Repeat(NewRotation.y + 180f, 360f) - 180f;
if (NewRotation.y == 180)
{
NewRotation.y -= 1;
}
if (TargetRotation.y == CurrentRotation.y)
{
IsTurned = true;
return;
}
if (NewRotation.y > 0)
{
transform.Rotate(new Vector3(0, RotationSpeed, 0));
CurrentRotation.y += RotationSpeed;
}
else if (NewRotation.y < 0)
{
transform.Rotate(new Vector3(0, -RotationSpeed, 0));
CurrentRotation.y -= RotationSpeed;
}
}
我目前没有时间在Unity上测试,所以我给你一些伪代码来帮助你解决你的问题
// Get the direction of where the player should ahead in world space
Vector3 hMoveDir = cameraTransform.right * movementHorizontal;;
Vector3 vMoveDir= cameraTransform.forward * movementVertical;
Vector3 moveDir = hMoveDir + vMoveDir;
// Create the rotation we need according to moveDir
lookRotation = Quaternion.LookRotation(moveDir);
// Rotate player over time according to speed until we are in the required rotation
playerTransform.rotation = Quaternion.Slerp(playerTransform.rotation, lookRotation , Time.deltaTime * RotationSpeed);