【unity实战】使用新版输入系统Input System+Rigidbody实现第三人称人物控制器(附项目源码)

最终效果

在这里插入图片描述

前言

使用CharacterController实现3d角色控制器,之前已经做过很多了:
【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用
【unity实战】Cinemachine虚拟相机+Character Controller实现俯视角、第三人称角色控制,复制粘贴即用

有的人就会问了,使用Rigidbody要怎么做呢?这不就来了,本文主要是使用新版输入系统Input System+Rigidbody实现第三人称人物控制器,我就不做特别复杂了,其他内容欢迎大家自行补充。因为我也不是很推荐大家使用Rigidbody,CharacterController 其实已经可以满足我们开发中的所有需求了。Rigidbody定义一些CharacterController自带的功能真的非常麻烦,比如爬坡,走楼梯等等,所以我这里主要只是带大家了解一下,并不会深入研究。

使用Input System获取玩家输入

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

我这里直接使用Player Input组件,生成的默认的Input Actions映射
在这里插入图片描述
新增脚本获取玩家输入

/// <summary>
/// 玩家输入
/// </summary>
public class PlayerInput : MonoBehaviour
{// 用于存储移动输入的向量public Vector2 MoveInput { get; private set; }// 用于存储视角输入的向量public Vector2 LookInput { get; private set; }public bool ChangeCameraWasPressedThisFrame{get; private set; }//是否按下切换相机private InputActions _input;private void OnEnable(){_input = new InputActions();_input.Player.Enable();_input.Player.Move.performed += SetMove;_input.Player.Move.canceled += SetMove;_input.Player.Look.performed += SetLook;_input.Player.Look.canceled += SetLook;}private void OnDisable(){_input.Player.Move.performed -= SetMove;_input.Player.Move.canceled -= SetMove;_input.Player.Look.performed -= SetLook;_input.Player.Look.canceled -= SetLook;_input.Player.Disable();  }private void SetMove(InputAction.CallbackContext context){MoveInput = context.ReadValue<Vector2>();}private void SetLook(InputAction.CallbackContext context){LookInput = context.ReadValue<Vector2>();}
}

人物添加刚体

添加刚体,配置参数
在这里插入图片描述

控制角色移动

新增脚本控制角色移动,对这里的AddRelativeForce不太了解的小伙伴可以查看我这篇文章:
【unity小技巧】常用的方法属性和技巧汇总(长期更新)
在这里插入图片描述

public class PlayerController : PlayerInput
{Rigidbody _rb;[Header("移动")][SerializeField] float _speed= 1000f;// 移动的速度private void Awake(){_rb = GetComponent<Rigidbody>();}private void FixedUpdate(){PlayerMove();}// 计算并应用玩家的移动private void PlayerMove(){// 根据输入和速度计算移动向量_playerMoveInput = new Vector3(MoveInput.x, 0, MoveInput.y).normalized * _speed;// 将相对力应用到刚体上_rb.AddRelativeForce(_playerMoveInput, ForceMode.Force);}
}

配置
在这里插入图片描述

效果
在这里插入图片描述

手搓代码控制相机视角

修改PlayerInput

[Header("相机视角控制")]
public Transform CameraFollow;// 用于跟随摄像机的 Transform
private Vector3 _playerLookInput;// 玩家视角输入
private float _playerRotation;// 角色旋转角度
private float _cameraPitch;// 摄像机俯仰角度
[SerializeField] float _rotationSpeed = 180.0f;// 角色旋转速度
[SerializeField] float _pitchSpeed = 180.0f;// 摄像机俯仰速度private void Awake()
{_rb = GetComponent<Rigidbody>();mainCamera = Camera.main; // 获取主相机
}private void Update()
{_playerLookInput = new Vector3(LookInput.x, -LookInput.y, 0f) * Time.deltaTime;// 获取视角输入PlayerLook(); // 更新角色的旋转PitchCamera(); // 更新摄像机的俯仰角度
}// 更新角色的旋转
private void PlayerLook()
{_playerRotation += _playerLookInput.x * _rotationSpeed;_rb.rotation = Quaternion.Euler(0f, _playerRotation, 0f);
}// 更新摄像机的俯仰角度
private void PitchCamera()
{Vector3 rotationValues = CameraFollow.rotation.eulerAngles;_cameraPitch += _playerLookInput.y * _pitchSpeed;_cameraPitch = Mathf.Clamp(_cameraPitch, -89.9f, 89.9f);//限制俯仰视角角度CameraFollow.rotation = Quaternion.Euler(_cameraPitch, rotationValues.y, rotationValues.z);
}

配置相机为角色的子物体
在这里插入图片描述
效果
在这里插入图片描述

最终代码

using UnityEngine;public class PlayerController : PlayerInput
{Rigidbody _rb;[Header("移动")]Vector3 _playerMoveInput;// 玩家移动向量[SerializeField] float _speed = 1000f;// 移动的速度[Header("相机视角控制")]public Transform CameraFollow;// 用于跟随摄像机的 Transformsprivate Vector3 _playerLookInput;// 玩家视角输入private float _playerRotation;// 角色旋转角度private float _cameraPitch;// 摄像机俯仰角度[SerializeField] float _rotationSpeed = 180.0f;// 角色旋转速度[SerializeField] float _pitchSpeed = 180.0f;// 摄像机俯仰速度private Camera mainCamera; // 主相机private void Awake(){_rb = GetComponent<Rigidbody>();mainCamera = Camera.main; // 获取主相机}private void Update(){_playerLookInput = new Vector3(LookInput.x, -LookInput.y, 0f) * Time.deltaTime;// 获取视角输入PlayerLook(); // 更新角色的旋转PitchCamera(); // 更新摄像机的俯仰角度}private void FixedUpdate(){PlayerMove();}// 计算并应用玩家的移动private void PlayerMove(){// 根据输入和速度计算移动向量_playerMoveInput = new Vector3(MoveInput.x, 0, MoveInput.y).normalized * _speed;// 将相对力应用到刚体上_rb.AddRelativeForce(_playerMoveInput, ForceMode.Force);}// 更新角色的旋转private void PlayerLook(){_playerRotation += _playerLookInput.x * _rotationSpeed;_rb.rotation = Quaternion.Euler(0f, _playerRotation, 0f);}// 更新摄像机的俯仰角度private void PitchCamera(){Vector3 rotationValues = CameraFollow.rotation.eulerAngles;_cameraPitch += _playerLookInput.y * _pitchSpeed;_cameraPitch = Mathf.Clamp(_cameraPitch, -89.9f, 89.9f);//限制俯仰视角角度CameraFollow.rotation = Quaternion.Euler(_cameraPitch, rotationValues.y, rotationValues.z);}
}

源码

很遗憾源码我并不想免费分享,我也建议大家能自己手动去敲代码,逐步实现和理解每一块功能。项目实现所涉及的主要功能思路和代码我也已经毫无保留的分享在文章中了,当然,如果你真的需要的话,源码我也放出来了,收个辛苦费,就当作你对我不断创作的支持。力量随微,心暖人。您的每一次支持都是我创作的最大动力!!!

https://gf.bilibili.com/item/detail/1106435120

完结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/415662.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速入门Go:Go + gin + MongoDB

Go 进阶:Go + gin + MongDB 极速搭建EcommerceSys电商系统 前言 本章节适合有一定基础的 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 本文章持续更新中,请关注… 项目结构 项目流程图 技术栈(待补充)项目结构项目路由 (待补充) …

DataWhale AI夏令营-《李宏毅深度学习教程》笔记-task3

DataWhale AI夏令营-《李宏毅深度学习教程》笔记-task2 第五章 循环神经网络5.1 独热编码5.2 RNN架构5.3 其他RNN5.3.1 Elman 网络 &Jordan 网络5.3.2 双向循环神经网络 第五章 循环神经网络 循环神经网络RNN&#xff0c;RNN在处理序列数据和时间依赖性强的问题上具有独特…

51单片机——实时时钟

1、DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能 RTC(Real Time Clock)&#xff1a;实时时钟&#xff0c;是一种集成电路&#xff0c;通常称为时钟…

机器学习项目——基于机器学习(RNN LSTM 高斯拟合 MLP)的锂离子电池剩余寿命预测方法研究(代码/论文)

完整的论文代码见文章末尾 以下为核心内容和部分结果 摘要 机器学习方法在电池寿命预测中的应用主要包括监督学习、无监督学习和强化学习等。监督学习方法通过构建回归模型或分类模型&#xff0c;直接预测电池的剩余寿命或健康状态。无监督学习方法则通过聚类分析和降维技术&…

VS-E5PH3006L-N3 600V 30A 高效低损耗整流器 二极管 电动 / 混动汽车电池充电的可靠之选

VS-E5PH3006L-N3参数特性&#xff1a; 反向电压&#xff08;VR&#xff09;&#xff1a;600V&#xff0c;这表示该整流器在电路中能承受的最大反向电压为 600 伏特&#xff0c;超过此电压可能会导致器件损坏。平均整流电流&#xff08;IF (AV)&#xff09;&#xff1a;30A&…

【系统架构设计】嵌入式系统设计(2)

【系统架构设计】嵌入式系统设计&#xff08;2&#xff09; 嵌入式网络系统嵌入式 Internet 的接入方式嵌入式 TCP/IP 协议栈 嵌入式数据库管理系统数据的一致性高效的事务处理数据的安全性 实时系统与嵌入式操作系统对实时系统划分根据实时性的强弱根据对错失时限的容忍程度或…

Linux学习-虚拟化平台安装和使用

注&#xff1a;系统使用Rock8.6 下载链接 通过百度网盘分享的文件&#xff1a;cirros.qcow2&#xff0c;node_base.xml等2个文件 链接&#xff1a;https://pan.baidu.com/s/1hupGQsMjrXMgngCy3lQLhw?pwdhlr6 提取码&#xff1a;hlr6[rootharbor ~]# cat /etc/redhat-releas…

《Class-Agnostic Counting》CVPR2018

概述 摘要&#xff1a;这篇论文提出了一种用于对象计数的模型&#xff0c;该模型能够计算任何类别的对象&#xff0c;而不需要针对特定对象类别进行设计。作者将计数问题表述为一个匹配问题&#xff0c;利用图像中自然存在的自相似性属性。论文的贡献包括&#xff1a;提出了一…

软件工程知识点总结(1):软件工程概述

1 什么是软件&#xff1f; 定义&#xff1a;计算机系统中的程序及其文档。 ——程序是计算机任务的处理对象和处理规模的描述&#xff1b; ——文档是为了便于了解程序所需要的阐明性资料。 2 软件的特点&#xff1f; 软件是无形的&#xff0c;不可见的逻辑实体 ——它的正确与…

人到中年,越发明白,随缘是成年人之间最好的社交状态

​时光荏苒&#xff0c;转眼间&#xff0c;我们已从青涩少年步入沉稳中年。 在这个阶段&#xff0c;我们经历了职场的起起落落&#xff0c;家庭的悲欢离合&#xff0c;也见证了身边人的种种变化。 正如屠格涅夫所言&#xff1a;“凡事只要看得淡些&#xff0c;就没有什么可忧…

C程序设计——指针杂谈0

变量和常量讲的差不多了&#xff0c;这里先把指针再深入理解一下&#xff0c;如果你是C语言初学者&#xff0c;本节可能看不太懂&#xff0c;没关系可以以后再看。 变量 当定义变量的时候&#xff0c;本质是在内存中分配了一段空间&#xff0c;这段空间的大小与变量的类型相关…

Hackme靶机通关攻略

1.首先注册用户&#xff0c;登录 2.登录后&#xff0c;显示让我们查找自己喜欢的书&#xff0c;我们直接单击search&#xff0c;会列出很多书 3.随便选择一本书进行查询&#xff0c;与此同时进行抓包 4.放到重放器中&#xff0c;将数据改为1*&#xff0c;将数据包另存为1.txt&a…

Python pip 更换镜像源

文章目录 1 概述1.1 默认镜像&#xff0c;速度慢&#xff0c;易报错1.2 常用国内镜像源 2 更改镜像源2.1 临时更改2.2 永久更改2.2.1 查看配置源及配置文件2.2.2 编辑 pip.ini2.2.3 配置后的效果 1 概述 1.1 默认镜像&#xff0c;速度慢&#xff0c;易报错 默认镜像&#xff…

Win32设备I/O详解

Windows设备 在Windows平台下&#xff0c;设备被定义为能够与之进行通信的任何东西。最常见的 I/O 设备包括&#xff1a;文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和管道等。 平常我们使用的文件&#xff0c;目录都可以称之为设备。…

MES系统:现代工厂生产车间的科技与管理创新

一、现代工厂生产车间&#xff1a;高度集成、自动化与智能化 在当今这个日新月异的工业时代&#xff0c;工厂生产车间已经远远超越了传统意义上的简单生产线概念&#xff0c;它们正逐步演变为一个高度集成、自动化与智能化的生态系统。这一变革不仅极大地提升了生产效率&#…

文件包含PHP伪协议利用方法

1、file 使用file协议读取Windows系统文件 2、php:filter协议 使用php://filter协议可以将php代码进行base64编码后显示出来 3、php://input 使用php://input协议可以将post请求的数据作为php代码运行 访问该协议并进行抓包 修改请求方式为POST 在下方输入php代码 点击forw…

【GIT】idea中实用的git操作,撤回commit,撤回push、暂存区使用

IDEA中最常见的UI操作&#xff1a;【GIT】Idea中的git命令使用-全网最新详细&#xff08;包括现象含义&#xff09; 文章目录 问题一&#xff1a; idea撤回仅commit错误的代码&#xff08;仅本地仓库&#xff0c;因为还没推送到远程&#xff09;问题二&#xff1a; idea撤回Com…

c++--智能指针(RAII)

智能指针可以帮助我们管理动态空间&#xff0c;即自动释放动态空间。 --------------------------------------------------------------------------------------------------------------------------------- 简单原理 事实上&#xff0c;智能指针的原理就是将指向动态空间…

浅谈人工智能之Windows:基于ollama进行本地化大模型部署

浅谈人工智能之Windows&#xff1a;基于ollama进行本地化大模型部署 引言 随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经成为推动自然语言处理领域进步的关键力量。然而&#xff0c;传统的云部署方式可能带来数据隐私、成本以及访问速…

【滑动窗口】将 x 减到 0 的最小操作数

将 x 减到 0 的最小操作数 将 x 减到 0 的最小操作数题目思路讲解代码书写 将 x 减到 0 的最小操作数 题目 题目链接: 将 x 减到 0 的最小操作数 思路讲解 按照题目的思路去做这一题是非常恶心的, 因此我们采用正难则反思路. 将问题转换为: 求中间某一个最长的数组长度, 使…