unity3d 角色控制器
以下是一个包含控制角色移动、第三人称、跳跃、二段跳、缩放相机和切换第一人称的完整角色控制代码示例
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("Movement")]
public float walkSpeed = 6.0f; // 控制走路速度
public float runSpeed = 10.0f; // 控制奔跑速度
public float jumpForce = 8.0f; // 控制跳跃力
public float doubleJumpForce = 6.0f; // 控制二段跳跃力
public float gravity = 20.0f; // 控制重力
private Vector3 moveDirection = Vector3.zero; // 控制移动方向
private bool isGrounded = true; // 判断是否在地面上
private bool doubleJump = false; // 判断是否可以二段跳
[Header("Camera")]
public Camera mainCamera; // 主摄像机
public float cameraSensitivity = 100.0f;// 控制鼠标灵敏度
private float zoom = 0.0f; // 控制相机缩放状态
private bool firstPersonView = false; // 判断是否在第一人称视角下
[Header("UI")]
public GameObject crosshair; // 准心UI
[Header("Audio")]
public AudioSource footstepAudio; // 脚步声音效果
public AudioSource jumpAudio; // 跳跃声音效果
private CharacterController characterController; // 角色控制器
private Vector3 originalCameraPosition; // 原始相机位置
private void Start()
{
characterController = GetComponent<CharacterController>();
originalCameraPosition = mainCamera.transform.localPosition;
}
private void Update()
{
Movement();
Jump();
CameraZoom();
SwitchView();
}
private void Movement()
{
float horizontalInput = Input.GetAxis("Horizontal"); // 获取水平输入
float verticalInput = Input.GetAxis("Vertical"); // 获取垂直输入
// 计算移动方向
Vector3 direction = new Vector3(horizontalInput, 0, verticalInput);
direction = transform.TransformDirection(direction);
direction.y = 0;
direction.Normalize();
// 根据是否按下Shift键来控制走路或奔跑速度
float speed = Input.GetKey(KeyCode.LeftShift) ? runSpeed : walkSpeed;
// 根据移动方向和速度来控制移动
moveDirection.x = direction.x * speed;
moveDirection.z = direction.z * speed;
// 减少重力
if (isGrounded)
{
moveDirection.y = 0;
}
else
{
moveDirection.y -= gravity * Time.deltaTime;
}
// 使用CharacterController的Move()方法来移动人物
characterController.Move(moveDirection * Time.deltaTime);
// 播放脚步声音效果
if (characterController.velocity.magnitude > 0 && isGrounded)
{
footstepAudio.Play();
}
}
private void Jump()
{
// 检查是否按下跳跃键
if (Input.GetKeyDown(KeyCode.Space))
{
// 如果在地面上,则进行普通跳跃
if (isGrounded)
{
moveDirection.y =
jumpForce;
jumpAudio.Play(); // 播放跳跃声音效果
doubleJump = true; // 设置为可以二段跳
}
// 如果不在地面上,并且可以进行二段跳,则进行二段跳
else if (doubleJump)
{
moveDirection.y = doubleJumpForce;
jumpAudio.Play(); // 播放跳跃声音效果
doubleJump = false; // 设置为不可以二段跳
}
}
// 检查是否落到地面上
RaycastHit hit;
if (Physics.Raycast(transform.position, -transform.up, out hit, characterController.height / 2 + 0.1f))
{
isGrounded = true;
doubleJump = false;
}
else
{
isGrounded = false;
}
}
private void CameraZoom()
{
// 获取滚轮输入
float zoomInput = Input.GetAxis("Mouse ScrollWheel");
// 根据滚轮输入来缩放相机
zoom += zoomInput;
zoom = Mathf.Clamp(zoom, -2f, 2f);
mainCamera.transform.localPosition = originalCameraPosition + new Vector3(0, 0, zoom * 0.5f);
}
private void SwitchView()
{
// 检查是否按下V键来切换视角
if (Input.GetKeyDown(KeyCode.V))
{
if (firstPersonView)
{
// 从第一人称视角切换到第三人称视角
mainCamera.transform.localPosition = originalCameraPosition;
mainCamera.transform.parent = transform;
firstPersonView = false;
crosshair.SetActive(true);
}
else
{
// 从第三人称视角切换到第一人称视角
mainCamera.transform.localPosition = Vector3.zero;
mainCamera.transform.parent = transform.Find("FirstPersonView");
firstPersonView = true;
crosshair.SetActive(false);
}
}
}
该脚本使用CharacterController进行人物移动,跳跃和第三人称相机,同时添加了二段跳、相机缩放和切换第一人称等功能。
控制人物移动的方法Movement()获取水平和垂直输入,计算出运动方向,并乘以相应的移动速度进行移动。然后在每一帧上减少重力以模拟重力效果,最后使用CharacterController的Move()方法来移动人物。
控制跳跃的方法Jump()检查是否按下了跳跃键,如果是则根据是否在地面上来确定使用普通跳跃还是二段跳跃,并将运动方向的y分量设置为跳跃力。
控制相机缩放的方法CameraZoom()获取鼠标滚轮输入并设置缩放状态。如果是缩放状态,它会逐渐改变主摄像机的视野以实现缩放效果。
控制第一人称的方法SwitchView()检查是否按下了Tab键,并根据状态切换到第一人称或第三人称视角。在第一人称视角下,禁用CharacterController并将主摄像机放置在角色的头部位置,然后允许玩家使用鼠标控制视角。在第三人称视角下,启用CharacterController并将主摄像机与角色分离。
在OnControllerColliderHit()方法中检测角色是否在地面上,如果是,则将isGrounded设置为true,允许跳跃。
在OnTriggerEnter()方法中检测是否与JumpPad触发器相交,如果是,则使用物理公式计算角色的新y方向速度以模拟跳跃板的效果。
请注意,该代码仅供参考,并可能需要根据您的具体项目进行修改和调整。