相机在蜷缩在一起时在旋转的球员上摇晃

时间:2017-03-30 17:19:50

标签: c# unity3d camera unity5

播放器后面的相机出现问题。当玩家移动时,相机会晃动,当玩家处于蹲伏位置时,此效果会更明显。我正在通过mixamo为播放器使用root动作。

播放器脚本:

Transform cameraT;
void Start () {
cameraT = Camera.main.transform;
}
void FixedUpdate ()
{
float sideMotion = Input.GetAxis("SideMotion");
float straightMotion= Input.GetAxis("StraightMotion");
if (Mathf.Abs(sideMotion) > 0 || Mathf.Abs(straightMotion) > 0)
     {
         transform.eulerAngles = new Vector3(transform.eulerAngles.x, 
cameraT.eulerAngles.y);

     }
}

相机脚本:

public float distanceFromPlayer=2f;

 public float mouseSensitivity=6;

 public Transform player;

 public Vector2 pitchConstraint= new Vector2(-30,80);

 Vector3 rotationSmoothVelocity;
 Vector3 currentRotation;
 public float rotationSmoothTime = 0.2f;

 float yaw; //Rotation around the vertical axis is called yaw

 float pitch; //Rotation around the side-to-side axis is called pitch

 private void LateUpdate()
 {
     yaw += Input.GetAxis("Mouse X") * mouseSensitivity;
     pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity;
     pitch = Mathf.Clamp(pitch, pitchConstraint.x, pitchConstraint.y);

     currentRotation = Vector3.SmoothDamp
         (currentRotation, new Vector3(pitch, yaw), ref rotationSmoothVelocity, rotationSmoothTime);


     transform.eulerAngles = currentRotation;

     transform.position = player.position - transform.forward * distanceFromPlayer;
 }

对于公共变换,我只是将一个空的游戏对象添加到玩家胸部水平并将其作为玩家的父级。我从在线教程中得到了旋转相机的平滑技巧,但确切的事情不适用于玩家轮换。

角色控制器连接到播放器,没有任何刚体或对撞机。

1 个答案:

答案 0 :(得分:0)

您将要在相机上使用Lerp,以便将其运动从一个位置平滑到另一个位置。 Scripting API有一个很好的Vector3.Lerp示例。

因此,在您的情况下,您还可以添加公共变量以平滑位置。像positionSmoothTime这样的东西。然后创建一个“Desired Position”变量,我们称之为destPosition。

Vector3 destPosition = player.position - transform.forward * distanceFromPlayer;

transform.position = Vector3.Lerp(transform.position, destPosition, positionSmoothTime);

这应该有效地将它平滑到口吃应该消失的地方。另一件有助于其他人提到的事情就是使用较少移动的身体部位(如头部)作为目标。这与Lerp功能相结合,将为您提供平稳的相机移动。

另一个重要的帮助是将事情转移到Update()函数中。原因是FixedUpdate()每帧都没有被调用。因此,你可能会因此而口吃。如果您将所有内容移动到Update(),它将更新每一帧并帮助解决问题。如果你这样做,你需要将所有移动乘以Time.deltaTime,如下例所示。

Vector3 destPosition = (player.position - transform.forward * distanceFromPlayer) * Time.deltaTime;

有关更多示例,请查看每个函数的链接以查看Unity的文档。它有我在这里展示的所有内容的例子。