【发布时间】:2021-05-25 05:54:21
【问题描述】:
我正在尝试在 Unity 中重新创建“GTA 风格”第三人称相机。我创建了使玩家沿相机指向的方向旋转的代码。但是,相机是玩家的孩子,所以当我旋转玩家时,我也会旋转相机。所以我必须重置相机的 Y 旋转。在“转身”中会导致一两帧让相机朝不同的方向看。
脚本:
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 旋转。
我尝试过的:
- 使用 slerp 平滑摄像机角度。
注意:我尝试过 slerping,但我不确定我是否正确。
- 取消目标(相机)
结果:这只是让相机不跟随播放器,但它表明我的转动播放器的代码有些功能。
- 将播放器(在脚本中)设置为图形。
结果:这给了我一个奇怪的播放器视图,并让播放器上下旋转。
抱歉,这篇冗长而复杂的帖子!
【问题讨论】:
-
你为什么不直接使用 Cinemachine?这是一个相当不错的插件,它带有 Unity 本身,并有第三人称跟随相机,有很多设置可以调整。