Unity C#:第三人称相机控制器:朝相机方向旋转时捕捉

Unity C#: Third Person Camera Controller: Snaps when rotating toward camera direction

我正在尝试在 Unity 中重新创建“GTA-Style”第三人称相机。我创建了让玩家沿相机指向的方向旋转的代码。但是,相机是播放器的child,所以当我旋转播放器时,我也旋转了相机。所以我必须重置相机的 Y 旋转。在 "turn" 中会导致一两帧让相机朝不同的方向看。

Hierarchy of Player:

脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ThirdPersonCamera : MonoBehaviour
{
    public float rotationSpeed = 2f;
    public Transform target, player;
    float mouseX;
    float mouseY;
    float h;
    float v;
    
    // Start is called before the first frame update
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }
    
    void LateUpdate()
    {
        h = Input.GetAxis("Horizontal");
        v = Input.GetAxis("Vertical");
        mouseX += Input.GetAxis("Mouse X") * rotationSpeed;
        mouseY -= Input.GetAxis("Mouse Y") * rotationSpeed;
        mouseY = Mathf.Clamp(mouseY, -35, 60);
        CamControl();
    }
    
    void CamControl()
    {
        transform.LookAt(target);
        if (h != 0 || v != 0)
        {
            target.rotation = Quaternion.Euler(mouseY, mouseX, 0);
            player.rotation = Quaternion.Euler(0, mouseX, 0);
        }
        else
        {
            target.rotation = Quaternion.Euler(mouseY, mouseX, 0);
            while (h != 0 || v != 0)
            {
                target.rotation = Quaternion.Euler(target.rotation.x, 0, target.rotation.z);
                player.rotation = Quaternion.Euler(player.rotation.x, player.rotation.y - target.rotation.y + 180, player.rotation.z);
            }
            
        }
    }
}

这个脚本是如何工作的: How I have it set up on Main Camera.(通知层级设置) 注意:“Player”和“Target”变量与分配给它们的游戏对象同名。 如果水平和垂直轴上没有输入,相机将像正常情况一样围绕玩家旋转。 如果在水平轴和垂直轴上有输入,玩家将面向相机所面对的方向。然后它必须重置相机的 Y 旋转。

我尝试过的:

  1. 使用 slerp 平滑相机角度。

注意:我试过 slerping,我不确定我做的是否正确。

  1. 取消child目标(相机)

结果:这只是让相机不跟随播放器,但它表明我的代码转动播放器有些功能。

  1. 将播放器(在脚本中)设置为图形。

结果:这让我对播放器产生了奇怪的看法,并使播放器也上下旋转。

抱歉冗长复杂post!

如果您的旋转播放器和相机的代码在从播放器中取消目标时有效,则不要在播放器中对相机目标进行子化。
相反,让目标跟随玩家。

例如:

void CamControl()
{
    target.position = player.position;

    transform.LookAt(target);
    ...
}

然后您可以使用 SmoothDamp 进行平滑跟随,而不是直接复制玩家位置。

此外,如果你的播放器是由物理控制的(使用刚体进行运动),你应该在固定更新中更新你的相机。