当前位置: 首页 > article >正文

【unity实战】利用Root Motion+Blend Tree+Input System+Cinemachine制作一个简单的角色控制器

文章目录

  • 前言
  • 动画设置
  • Blend Tree配置
  • 角色添加刚体和碰撞体
  • 代码控制人物移动
  • 那么我们接下来调整一下相机的视角
  • 效果
  • 参考
  • 完结

前言

Input System知识参考:
【推荐100个unity插件之18】Unity 新版输入系统Input System的使用,看这篇就够了

Cinemachine虚拟相机知识参考:
【推荐100个unity插件之10】Unity最全的最详细的Cinemachine(虚拟相机系统)介绍,详细案例讲解,快速上手
【unity实战】Cinemachine虚拟相机实战,使用InputSystem+Cinemachine+CharacterController复刻各种主流游戏的相机控制

动画设置

在这里插入图片描述

在这里插入图片描述
移动和行走记得勾选循环
在这里插入图片描述

Blend Tree配置

我们做一个俯视角的一个角色控制器,我们自动计算一下他们的阈值
然后我们参考的是他们在Z方向的速度
在这里插入图片描述
效果
在这里插入图片描述
比如说我们现在希望行走的速度是1.5

使用1.5/1.6=0.94左右,得到他的播放速度
在这里插入图片描述
然后假设我们希望奔跑的速度是3.5,3.5/3.4=1.02左右
在这里插入图片描述
在这里插入图片描述

角色添加刚体和碰撞体

在这里插入图片描述

代码控制人物移动

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    public Transform playerTransform; // 角色的 Transform 组件
    public float currentSpeed; // 当前速度
    public float targetSpeed; // 目标速度
    public float walkSpeed = 1.5f; // 行走速度
    public float runSpeed = 3.5f; // 跑步速度
    public float rotateSpeed = 700f; // 旋转速度(假设你要添加这个变量)

    private Animator animator; // 动画控制器
    private Vector2 playerInputVec; // 玩家输入向量
    private bool isRunning; // 是否正在跑步

    // Start 是在第一次帧更新之前调用
    void Start()
    {
        animator = GetComponent<Animator>(); // 获取 Animator 组件
        playerTransform = transform; // 初始化 playerTransform
    }

    // Update 每帧调用一次
    void Update()
    {
        RotatePlayer(); // 旋转角色
        MovePlayer(); // 移动角色
    }

    // 获取玩家移动输入
    public void GetPlayerMoveInput(InputAction.CallbackContext ctx)
    {
        playerInputVec = ctx.ReadValue<Vector2>(); // 读取输入值
        Debug.Log(playerInputVec); // 打印输入向量
    }

    // 获取玩家跑步输入
    public void GetPlayerRunInput(InputAction.CallbackContext ctx)
    {
        isRunning = ctx.ReadValue<float>() > 0; // 判断是否在跑步
        Debug.Log(isRunning); // 打印跑步状态
    }

    // 旋转角色
    void RotatePlayer()
    {
        if (playerInputVec.Equals(Vector2.zero))
            return; // 如果没有输入,返回

        Vector3 playerMovement = new Vector3(playerInputVec.x, 0, playerInputVec.y); // 根据输入向量计算移动方向
        Quaternion targetRotation = Quaternion.LookRotation(playerMovement, Vector3.up); // 计算目标旋转

        // 旋转角色
        playerTransform.rotation = Quaternion.RotateTowards(playerTransform.rotation, targetRotation, rotateSpeed * Time.deltaTime);
    }

    // 移动角色
    void MovePlayer()
    {
        targetSpeed = isRunning ? runSpeed : walkSpeed; // 设置目标速度
        targetSpeed *= playerInputVec.magnitude; // 根据输入的大小调整目标速度

        // 平滑过渡到目标速度
        currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, 0.5f);

        // 设置动画参数
        animator.SetFloat("Vertical Speed", currentSpeed);
    }
}

那么我们接下来调整一下相机的视角

在这里插入图片描述
就是就是这个这个foow指的是相机的移动是跟随着那个目标的
然后这个look at的曲子是相机要追着哪一就是游戏对象去进行旋转
然后我们这里我们这里可能不需要旋转,把Aim改为Hard Look At

把Aim改为Hard Look At
把M这里写的就是盯着他看
不做任何的其他的行为

改为世界坐标模式,并修改对应的相机位置,比如高度等
X Damping
Y Damping
Z Damping
控制跟随延迟,我们不希望他延迟,都设置为0
在这里插入图片描述

效果

在这里插入图片描述

参考

https://www.bilibili.com/video/BV1Ur4y1b7ff

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述


http://www.kler.cn/a/291193.html

相关文章:

  • 有关Redis的相关概述
  • ADO.NET知识总结3---SqlCommand命令对象
  • DeepSeek-V3与GPT-4o的对比详解
  • xxl-job回调执行器,发生NPE空指针异常
  • 继承(6)
  • mysql -> 达梦数据迁移(mbp大小写问题兼容)
  • Hive时间窗口函数保姆级教程(最全解析、应用和优化)(持续更新)
  • 87、k8s之污点
  • Python实战项目:天气数据爬取+数据可视化(完整代码)_python爬虫实战
  • js逆向--绕过debugger(二)
  • UE5学习笔记19-服务器的更新频率,根骨骼旋转节点
  • Docker使用tensorflow/serving镜像部署模型
  • 第二证券:有风险!筹码集中股出炉,这10股股东数骤降
  • Java 面试题:TCP重传机制与拥塞控制 --xunznux
  • 在VitePress中进行页面链接:最佳实践与实例
  • 90分钟实现一门编程语言——极简解释器教程
  • 巧用 HTML 列表:<ul>、<ol>、<dl>的实用指南
  • 美团转正成功,实习经验大分享!
  • 若依系统的学习
  • 我与Linux的爱恋:Linux的基本指令
  • C++11新增特性:列表初始化(std::initializer_list) decltype、auto、nullptr、范围for
  • RISC-V最先进CPU微架构分析
  • Flutter修改Android包名
  • 3.js - modelPosition.z = sin((modelPosition.x+uTime)*10.0)*0.05;
  • # Windows下配置Redis以服务方式启动
  • 创新大赛国赛路演:如何准备一份打动人心的路演稿