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 旋转。
我尝试过的:
- 使用 slerp 平滑相机角度。
注意:我试过 slerping,我不确定我做的是否正确。
- 取消child目标(相机)
结果:这只是让相机不跟随播放器,但它表明我的代码转动播放器有些功能。
- 将播放器(在脚本中)设置为图形。
结果:这让我对播放器产生了奇怪的看法,并使播放器也上下旋转。
抱歉冗长复杂post!
如果您的旋转播放器和相机的代码在从播放器中取消目标时有效,则不要在播放器中对相机目标进行子化。
相反,让目标跟随玩家。
例如:
void CamControl()
{
target.position = player.position;
transform.LookAt(target);
...
}
然后您可以使用 SmoothDamp 进行平滑跟随,而不是直接复制玩家位置。
此外,如果你的播放器是由物理控制的(使用刚体进行运动),你应该在固定更新中更新你的相机。
我正在尝试在 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 旋转。
我尝试过的:
- 使用 slerp 平滑相机角度。
注意:我试过 slerping,我不确定我做的是否正确。
- 取消child目标(相机)
结果:这只是让相机不跟随播放器,但它表明我的代码转动播放器有些功能。
- 将播放器(在脚本中)设置为图形。
结果:这让我对播放器产生了奇怪的看法,并使播放器也上下旋转。
抱歉冗长复杂post!
如果您的旋转播放器和相机的代码在从播放器中取消目标时有效,则不要在播放器中对相机目标进行子化。
相反,让目标跟随玩家。
例如:
void CamControl()
{
target.position = player.position;
transform.LookAt(target);
...
}
然后您可以使用 SmoothDamp 进行平滑跟随,而不是直接复制玩家位置。
此外,如果你的播放器是由物理控制的(使用刚体进行运动),你应该在固定更新中更新你的相机。