Unity实现角色控制器流畅控制人物

Hello,有缘人,这里是橘子广场,this is a Unity角色控制器的代码,实现人物的流场控制和视角的转换。我这里使用的是第一人称人物控制,当然第三人称重新设置下相机即可。
Unity实现角色控制器流畅控制人物_第1张图片

首先搭建好场景,空物体加角色控制器,设置好碰撞体大小,将主摄像机放在角色头上。
Unity实现角色控制器流畅控制人物_第2张图片
然后自行设置Run即奔跑按键Edit->ProjectSetts->Inpute(我设置的是左侧shift键)
Unity实现角色控制器流畅控制人物_第3张图片

接下来就是具体代码:

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;
    }
    /// 
    /// 光标可视化处理
    /// 
    /// 
    public void DisplayCursor(bool display)
    {
        Cursor.lockState = display ? CursorLockMode.None : CursorLockMode.Locked;
        Cursor.visible = display;
    }
}

脚本的参数自行设置即可;接下来就可以愉快地移动了。(有问题和指教可以私信me哟)
Unity实现角色控制器流畅控制人物_第4张图片

你可能感兴趣的:(unity3d,游戏开发)