unity第一人称角色移动跳跃加速,摄像机跟随摄像机y轴角度限制
时间: 2023-07-11 11:27:44 浏览: 155
以下是一个简单的第一人称角色移动、跳跃、加速和摄像机跟随实现的示例代码。
首先,在场景中创建一个空物体作为角色控制器,并将一个第一人称摄像机作为其子对象。为了实现摄像机跟随,我们需要将摄像机的位置设置在角色控制器的前方,然后使用 LookAt 方法让摄像机朝向角色控制器。
然后,我们需要编写脚本来控制角色移动、跳跃、加速和摄像机跟随。以下是示例代码:
```csharp
using UnityEngine;
public class FirstPersonController : MonoBehaviour
{
public float moveSpeed = 5.0f;
public float jumpForce = 10.0f;
public float gravity = 20.0f;
public float sprintSpeedMultiplier = 2.0f;
public float maxSlopeAngle = 45.0f;
public float cameraRotationLimit = 90.0f;
private CharacterController controller;
private Transform cameraTransform;
private Vector3 moveDirection = Vector3.zero;
private bool isSprinting = false;
private float cameraRotationX = 0.0f;
void Start()
{
controller = GetComponent<CharacterController>();
cameraTransform = transform.GetChild(0);
cameraTransform.position = transform.position + transform.forward * 2.0f;
cameraTransform.LookAt(transform);
}
void Update()
{
// 计算移动方向
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Vector3 inputDirection = new Vector3(horizontal, 0.0f, vertical);
inputDirection = transform.TransformDirection(inputDirection);
inputDirection.Normalize();
// 计算垂直方向的速度
if (controller.isGrounded)
{
moveDirection.y = 0.0f;
if (Input.GetButtonDown("Jump"))
{
moveDirection.y = jumpForce;
}
}
moveDirection.y -= gravity * Time.deltaTime;
// 计算水平方向的速度
float speed = moveSpeed;
if (isSprinting)
{
speed *= sprintSpeedMultiplier;
}
if (inputDirection.magnitude > 0.0f)
{
float slopeAngle = Vector3.Angle(Vector3.up, controller.normal);
if (slopeAngle <= maxSlopeAngle)
{
moveDirection.x = inputDirection.x * speed;
moveDirection.z = inputDirection.z * speed;
}
}
else
{
moveDirection.x = 0.0f;
moveDirection.z = 0.0f;
}
// 应用移动速度
controller.Move(moveDirection * Time.deltaTime);
// 处理摄像机旋转
float rotationX = Input.GetAxis("Mouse X") * Time.deltaTime * 100.0f;
float rotationY = Input.GetAxis("Mouse Y") * Time.deltaTime * 100.0f;
transform.Rotate(0.0f, rotationX, 0.0f);
cameraRotationX -= rotationY;
cameraRotationX = Mathf.Clamp(cameraRotationX, -cameraRotationLimit, cameraRotationLimit);
cameraTransform.localRotation = Quaternion.Euler(cameraRotationX, 0.0f, 0.0f);
// 处理加速
isSprinting = Input.GetKey(KeyCode.LeftShift);
}
}
```
在这个示例中,我们定义了一个 FirstPersonController 类来管理角色移动、跳跃、加速和摄像机跟随。在 Start 方法中,我们获取了 CharacterController 和摄像机的 Transform 组件,并初始化了摄像机的位置和朝向。在 Update 方法中,我们首先计算移动方向,并根据是否在地面上和是否按下跳跃键来计算垂直方向的速度。然后根据水平方向的输入和是否在斜坡上来计算水平方向的速度。最后,我们应用移动速度、处理摄像机旋转和处理加速。
注意,我们限制了摄像机的 Y 轴旋转角度,以避免出现摄像机翻转的问题。同时,我们还限制了角色在斜坡上移动的最大角度,以避免出现卡在斜坡上的问题。
阅读全文