【问题标题】:Unity C#: Third Person Camera Controller: Snaps when rotating toward camera directionUnity C#:第三人称相机控制器:向相机方向旋转时捕捉
【发布时间】:2021-05-25 05:54:21
【问题描述】:

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

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.(通知层级设置) 注意:“玩家”和“目标”变量与分配给它们的游戏对象具有相同的名称。 如果水平轴和垂直轴上没有输入,相机将像往常一样围绕玩家旋转。 如果在水平轴和垂直轴上有输入,则玩家将面向相机所面对的方向。然后它必须重置相机的 Y 旋转。

我尝试过的:

  1. 使用 slerp 平滑摄像机角度。

注意:我尝试过 slerping,但我不确定我是否正确。

  1. 取消目标(相机)

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

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

结果:这给了我一个奇怪的播放器视图,并让播放器上下旋转。

抱歉,这篇冗长而复杂的帖子!

【问题讨论】:

  • 你为什么不直接使用 Cinemachine?这是一个相当不错的插件,它带有 Unity 本身,并有第三人称跟随相机,有很多设置可以调整。

标签: c# unity3d camera


【解决方案1】:

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

例如:

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

    transform.LookAt(target);
    ...
}

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

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

【讨论】:

  • 这成功了!除非我必须在 LateUpdate() 中继续调用 CamControl(),否则玩家移动(单独的脚本)会滞后。
  • @VinnyRulesGaming 确实,我只是不知道您是如何更新玩家位置的,这取决于您如何操作:如果直接使用transform.position,那么您必须使用@ 987654323@ 更新您的相机位置,如果使用刚体(例如rigidbody.AddForce()),那么您必须使用FixedUpdate。否则你的相机会很迟钝:)
  • 我使用 transform.Translate.. soo
猜你喜欢
  • 2020-08-29
  • 2018-01-22
  • 2018-06-16
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多