Unity实现角色控制器流畅控制人物
Hello,有缘人,这里是橘子广场,this is a Unity角色控制器的代码,实现人物的流场控制和视角的转换。我这里使用的是第一人称人物控制,当然第三人称重新设置下相机即可。
首先搭建好场景,空物体加角色控制器,设置好碰撞体大小,将主摄像机放在角色头上。 然后自行设置Run即奔跑按键Edit->ProjectSetts->Inpute(我设置的是左侧shift键)
接下来就是具体代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController: MonoBehaviour
{
private CharacterController characterController;
[SerializeField]
private float moveSpeed;//移动速度
[SerializeField]
private float runSpeed;//奔跑速度
[SerializeField]
private float jumpSpeed;//起跳速度
[SerializeField]
private float mouseSensitivity;//鼠标灵敏度
private Vector3 moveVec;//控制移动的向量
float verticalAngle = 0;//控制垂直方向视野转动角度
float verticalSpeed = 0f;//跳跃和下落的速度改变
private void Awake()
{
characterController = this.gameObject.GetComponent<CharacterController>();
}
// Start is called before the first frame update
void Start()
{
DisplayCursor(false);//使光标不可见
}
// Update is called once per frame
void FixedUpdate()
{
//镜头移动
//获取鼠标当前位置的X和Y
float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity;
float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity;
//鼠标在Y轴上的移动转为摄像机的上下运动,即是绕着X轴转动,
mouseY = mouseY * mouseSensitivity;
verticalAngle = Mathf.Clamp(mouseY + verticalAngle, -89f, 89f);//限定垂直视角
Vector3 currentAngles = Camera.main.transform.localEulerAngles;
currentAngles.x = verticalAngle;
Camera.main.transform.localEulerAngles = currentAngles;
//鼠标在X轴上的移动转为对象左右的转动 同时带动其子物体摄像机的左右转动
transform.localRotation = transform.localRotation * Quaternion.Euler(0, mouseX * mouseSensitivity, 0);
//人物跳跃
if (characterController.isGrounded && Input.GetButtonDown("Jump"))
{
verticalSpeed = jumpSpeed;
}
//人物移动
bool running = Input.GetButton("Run");//Run需要自己去设置ProjectSetts->Inpute
float actualSpeed = running ? runSpeed : moveSpeed;
moveVec = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;//GetAxisRaw省去了虚拟轴-1到1的过渡
moveVec = this.transform.TransformDirection(moveVec);
characterController.Move(moveVec * actualSpeed * Time.fixedDeltaTime);
//人物垂直方向移动
verticalSpeed -= 10.0f * Time.fixedDeltaTime;
if (verticalSpeed < -10f)
verticalSpeed = -10f; //最大下落速度
var verticalMove = new Vector3(0, verticalSpeed * Time.fixedDeltaTime, 0);
var flag = characterController.Move(verticalMove);
if ((flag & CollisionFlags.Below) != 0)
verticalSpeed = 0;
}
/// <summary>
/// 光标可视化处理
/// </summary>
/// <param name="display"></param>
public void DisplayCursor(bool display)
{
Cursor.lockState = display ? CursorLockMode.None : CursorLockMode.Locked;
Cursor.visible = display;
}
}
脚本的参数自行设置即可;接下来就可以愉快地移动了。(有问题和指教可以私信me哟)
