【Unity】使用Cinemachine+CharacterController实现第三人称视角下的角色视角、移动和跳跃控制

1.初始配置

  • 安装Cinemachine插件
  • 给角色添加CharacterConroller
  • 创建Cinemachine-->Free Look Camera
  • 在Free Look Camera中调整参数,Y Axis勾选Inver,X Axis取消勾选Inver
  • Free Look Camera要看向角色 + 跟随角色(自行设置,我就不再赘述了)

2.编写C#脚本

代码可以自行收藏直接用,关键自行调整的参数是:

speed、rotateSpeed、jumpHeight

cs 复制代码
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [Header("参数")] 
    public float speed; //角色移动速度(跑步的时候是两倍)
    public float rotateSpeed; //角色转向速度
    public float playerGravity = 9.8F; //角色重力
    public float jumpForce; //跳跃力度
    public float jumpHeight = 2F; //跳跃高度
    public float verticalVelocity = 0;//垂直速度
    [Header("状态")] 
    public bool isMove; //是否在移动
    public bool isRun; //是否在跑步
    [Header("输入")]
    public Vector3 inputDirection; //wasd输入(x值表示horizontal,z值表示vertical,y值为0)
    [Header("组件")]
    public CharacterController characterController; //这个在Start函数中初始化,你也可以在Inspector初始化
    private void Start()
    {
        inputDirection = new Vector3();
        characterController = GetComponent<CharacterController>();
    }

    private void Update()
    {
        //计算WASD输入
        inputDirection.x = Input.GetAxisRaw("Horizontal");
        inputDirection.z = Input.GetAxisRaw("Vertical");
        
        //获得是否是移动和跑步状态
        isMove = inputDirection.magnitude > 0;
        isRun = isMove && Input.GetKey(KeyCode.LeftShift);
        //光标的可见性设置
        if (Input.GetKeyDown(KeyCode.I))
        {
            Cursor.visible = !Cursor.visible;
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            characterController.SimpleMove(transform.up * jumpForce);
        }
        
        if (!isMove) return;
        //实现角色转向到相机平行于xz轴构成的平面的朝向
        Vector3 targetDirection = new Vector3(inputDirection.x, 0, inputDirection.z);
        float y = Camera.main.transform.rotation.eulerAngles.y;
        Quaternion targetRotation = Quaternion.Euler(0, y, 0) * Quaternion.LookRotation(targetDirection);
        // 使用Quaternion.Slerp进行平滑转向
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * rotateSpeed);
    }

    private void FixedUpdate()
    {
        Vector3 moveDirection = Vector3.zero;
        moveDirection += transform.forward * inputDirection.z;
        moveDirection += transform.right * inputDirection.x;
         moveDirection *= Time.fixedDeltaTime * (isRun ? speed*2 : speed);
        // 重力
        if (!characterController.isGrounded)
            verticalVelocity -= playerGravity * Time.fixedDeltaTime;// a*t=v
        else
            verticalVelocity = 0.0F;
        // 跳跃
        if (Input.GetButton("Jump"))
        {
            // 得在地面才能跳
            if (characterController.isGrounded)
            {
                verticalVelocity = Mathf.Sqrt(jumpHeight * 2 / playerGravity) * playerGravity;// 初始向上速度
            }
        }
        moveDirection.y += verticalVelocity * Time.fixedDeltaTime;// v*t=s
        // 移动
        characterController.Move(moveDirection);
    }
}

3.测试效果

测试运行效果,看看是否正常

相关推荐
小贺儿开发3 小时前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
淡海水4 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
小小数媒成员16 小时前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
林川~011 天前
Unity新输入系统使用笔记
unity·input system
小贺儿开发2 天前
Unity 结合百度AI开放平台 手写文字识别
人工智能·科技·学习·unity·云服务·文字识别·手写文字
goujunwe2 天前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
林川~012 天前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
yi碗汤园2 天前
MQTT消息队列遥测传输协议
网络·网络协议·unity
林川~013 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api
sensen_kiss3 天前
CPT306 Coursework 1 个人游戏作业——坦克大战
unity·游戏程序·游戏策划