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

news2024/9/22 1:04:59

文章目录

  • 前言
  • 动画设置
  • 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.coloradmin.cn/o/2106170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式全栈开发学习笔记---C++(函数/类模板)

目录 函数模板 模板机制 函数模板语法 函数模板和普通函数的区别 函数模板和普通函数调用规则 函数模板机制 排序模板函数 类模板 类模板语法 模板继承 类模板中的static关键字 模板声明 .hpp文件 类模板小结 上节学习了运算符重载&#xff0c;本节开始学习函数模…

使用 GZCTF 结合 GitHub 仓库搭建独立容器与动态 Flag 的 CTF 靶场+基于 Docker 的 Web 出题与部署+容器权限控制

写在前面 关于 CTF 靶场的搭建&#xff08;使用 CTFd 或者 H1ve&#xff09;以及 AWD 攻防平台的搭建&#xff0c;勇师傅在前面博客已经详细写过&#xff0c;可以参考我的《网站搭建》专栏&#xff0c;前段时间玩那个 BaseCTF&#xff0c;发现它的界面看着挺不错的&#xff0c…

LVGL 控件之复选框(lv_checkbox)和下拉列表(lv_dropdown)

目录 一、复选框1、组成2、设置复选框文本3、复选框部件的状态4、复选框事件5、API 函数 二、下拉列表1、组成2、选项2.1 添加选项2.2 获取当前选中的选项 3、设置3.1 设置列表展开方向3.2 设置下拉列表图标3.3 设置列表常显文本 4、事件5、API 函数 一、复选框 1、组成 复选…

Android studio 导出 release 版本的 .aar 文件

不同的android studio 版本可能会有不同的方案&#xff0c;我针对的是&#xff1a; 首先打开settings: Setting —> Experimental 界面 将选项&#xff1a;【configure all gradle tasks】勾上&#xff1a; 接着点击 File —> Sync Project with Gradle Files 然后&…

【js逆向专题】8.webpack打包

本教程仅供学习交流使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;请各学员自觉遵守相关法律法规。小节目标: 熟悉 webpack打包原理熟悉 webpack打包方式了解 webpack多模块打包 一. webpack打包 概念: webpack 是…

【颤抖不再怕,帕金森患者的活力锻炼秘籍!】

Hey小伙伴们~&#x1f44b; 今天我们来聊聊一个温暖而重要的话题——如何帮助我们的亲人或自己&#xff0c;在帕金森病的挑战下&#xff0c;依然保持生活的活力与光彩&#xff01;&#x1f308; 帕金森病&#xff0c;这个名字听起来或许让人心生畏惧&#xff0c;但它绝不是生活…

地产行业如何利用Java实现精准营销

在当今竞争激烈的地产市场中&#xff0c;如何有效触达潜在客户并促进销售转化&#xff0c;成为众多房企关注的焦点。106短信平台作为一种精准的营销工具&#xff0c;在地产行业中发挥着越来越重要的作用。 支持免费对接试用&#xff1a;乐讯通PaaS平台 找好用的短信平台,选择乐…

AUTO TECH 2025 华南展 第十二届广州国际汽车零部件加工技术及汽车模具展览会——探索未来出行的创新动力

AUTO TECH 2025 华南展 第十二届广州国际汽车零部件加工技术及汽车模具展览会——探索未来出行的创新动力 随着全球汽车工业的不断进步和新能源汽车技术的迅猛发展&#xff0c;2025年11月20-22日在广州保利世贸博览馆将迎来一场行业瞩目的盛会——2025 第十二届广州国际汽车零部…

外接串口板,通过串口打开adb模式

一、依赖库 import subprocess import serial from serial.tools import list_ports import logging import time 二、代码 import subprocessimport serial from serial.tools import list_ports import logging import timedef openAdb(com):# com []# for i in list_por…

无人机之地面站篇

无人机的地面站&#xff0c;又称无人机控制站&#xff0c;是整个无人机系统的重要组成部分&#xff0c;扮演着作战指挥中心的角色。以下是对无人机地面站的详细阐述&#xff1a; 一、定义与功能 无人机地面站是指具有对无人机飞行平台和任务载荷进行监控和操纵能力的一组设备&…

[数据集][目标检测]翻越栏杆行为检测数据集VOC+YOLO格式512张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;512 标注数量(xml文件个数)&#xff1a;512 标注数量(txt文件个数)&#xff1a;512 标注类别…

通过卷积神经网络(CNN)识别和预测手写数字

一&#xff1a;卷积神经网络&#xff08;CNN&#xff09;和手写数字识别MNIST数据集的介绍 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;是一种深度学习模型&#xff0c;它在图像和视频识别、分类和分割任务中表现出色。CNN通过模仿…

快排的深入学习

目录 交换类排序 一、冒泡排序 1. 算法介绍 2.算法流程 3. 算法性能分析 &#xff08;1&#xff09;时间复杂度分析 &#xff08;2&#xff09; 空间复杂度分析 冒泡排序的特性总结&#xff1a; 二、快速排序 1.算法介绍 2. 执行流程 1). hoare版本 2). 挖坑法 3)…

5.9灰度直方图

目录 实验原理 实验代码 运行结果 实验原理 calcHist 函数通常是指在计算机视觉和图像处理中用于计算图像直方图的一个函数。 cv:calcHist () 用于计算一个或多个数组的直方图。它可以处理图像数据并返回一个表示像素强度分布的向量&#xff08;对于灰度图像&#xff09;或…

Java:集合的相关汇总介绍

主要包含Set(集&#xff09;、 List(列表包含 Queue&#xff09;和 Map(映射)。 1、Collection&#xff1a; Collection 是集合 List、 Set、 Queue 的最基本的接口。 2、Iterator&#xff1a;迭代器&#xff0c;可以通过迭代器遍历集合中的数据。 3、Map&#xff1a;是映射表的…

VTK随笔十三:QT与VTK的交互

一、基于 Ot的 VTK 应用程序 以 VTK 读入一幅 JPG 图像&#xff0c;然后在 Qt 界面上使用 VTK 显示该图像为例&#xff0c;演示QT与VTK的交互。 1、创建QT项目QT_VTK_Demo 2、配置VTK库 在CMakeLists.txt中添加如下代码&#xff1a; 配置完成后重新打开工程加载VTK库。 3、编…

制裁下的转型:俄罗斯加密货币战略布局与人民币挂钩BRICS稳定币的崛起

在国际制裁重压下&#xff0c;俄罗斯正在积极推进加密货币政策改革&#xff0c;通过设立加密货币交易所和推动与人民币挂钩的BRICS稳定币&#xff0c;试图在全球金融体系中谋求新的生存与发展路径。这一系列举措标志着俄罗斯在数字经济领域的重大转向&#xff0c;既是对当前经济…

Linux【5】远程管理

目录 shutdown关机 ifconfig输出网卡信息 ping ip地址——检测连接正常 ssh 【-p port】 userip scp不同主机之间的文件copy 当前文件复制到远程 远程文件复制到本地 复制文件夹 -r shutdown关机 shutdown -r 重启 ifconfig输出网卡信息 ping ip地址——检测连接正常…

集成电路学习:什么是PCB印刷电路板

一、PCB&#xff1a;印刷电路板 PCB&#xff0c;全称为Printed Circuit Board&#xff0c;即印刷电路板&#xff0c;是现代电子设备中不可或缺的基础构件。它作为电子元器件的载体和连接体&#xff0c;在电子设备中发挥着至关重要的作用。以下是对PCB的详细解析&#xff1a; 二…

【C++初阶】一、C++入门(万字总结)

「前言」 「专栏」C详细版专栏 &#x1f308;个人主页&#xff1a; 代码探秘者 &#x1f308;C语言专栏&#xff1a;C语言 &#x1f308;C专栏&#xff1a; C &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 目录 一、关于C 1.1 什么是C 1.2 C 发展史 二、C关键字(C…