文章目录
- 前言
- 安装InputSystem,并导入重新绑定控制按键例子
- 输入控制
- 拿例子的重绑定按钮预制体
- 绑定对应按钮
- 升级文本
- 新增全屏覆盖的提示文本
- 配置绑定
- 绑定当前启用的输入键
- 禁用一些按钮的绑定和退出按键绑定状态
- 重复绑定按钮问题
- 重置绑定重复按钮
- 修改按钮绑定名字
- 添加两个变量
- 勾选第一个为真才显示输入文本
- 修改实际生效
- 绑定图标
- 这里演示绑定Xbox图标
- 重置所有按钮
- 保存和加载我们的按键绑定
- 参考
- 完结
前言
在游戏开发中,控制输入是至关重要的一环。Unity的新输入系统(Input System)为开发者提供了强大的工具来管理和处理用户输入,不仅支持各种平台上的多种输入设备,还能轻松处理复杂的输入操作和映射。本文将深入探讨如何使用Unity的新输入系统重新绑定控制按键,为开发者提供一套全面且完善的解决方案。
安装InputSystem,并导入重新绑定控制按键例子
输入控制
绑定映射
代码输入控制
public class UserInput : MonoBehaviour
{
// Singleton instance
public static UserInput instance;
// 移动输入向量
public Vector2 MoveInput { get; private set; }
// 跳跃输入标志位
public bool JumpJustPressed { get; private set; }
public bool JumpBeingHeld { get; private set; }
public bool JumpReleased { get; private set; }
// 攻击输入标志位
public bool AttackInput { get; private set; }
// 冲刺输入标志位
public bool DashInput { get; private set; }
// 菜单打开/关闭输入标志位
public bool MenuopencloseInput { get; private set; }
private PlayerInput _playerInput;
private InputAction _moveAction;
private InputAction _jumpAction;
private InputAction _attackAction;
private InputAction _dashAction;
private InputAction _menuopenCloseAction;
private void Awake()
{
// 单例模式实例化
if (instance == null)
{
instance = this;
}
_playerInput = GetComponent<PlayerInput>();
SetupInputActions();
}
private void Update()
{
// 每帧更新输入状态
UpdateInputs();
}
private void SetupInputActions()
{
// 从PlayerInput组件初始化输入动作
_moveAction = _playerInput.actions["Move"];
_jumpAction = _playerInput.actions["Jump"];
_attackAction = _playerInput.actions["Attack"];
_dashAction = _playerInput.actions["Dash"];
_menuopenCloseAction = _playerInput.actions["Menuopenclose"];
}
private void UpdateInputs()
{
// 更新特定的输入数值
MoveInput = _moveAction.ReadValue<Vector2>(); // 读取移动输入值
JumpJustPressed = _jumpAction.WasPressedThisFrame(); // 检测跳跃是否刚按下
JumpBeingHeld = _jumpAction.IsPressed(); // 检测跳跃是否正在按住
JumpReleased = _jumpAction.WasReleasedThisFrame(); // 检测跳跃是否刚释放
AttackInput = _attackAction.WasPressedThisFrame(); // 检测攻击是否刚按下
DashInput = _dashAction.WasPressedThisFrame(); // 检测冲刺是否刚按下
MenuopencloseInput = _menuopenCloseAction.WasPressedThisFrame(); // 检测菜单打开/关闭是否刚按下
}
}
拿例子的重绑定按钮预制体
拖入预制体
每个按钮需要一个预制体,包括重置全部按钮
绑定对应按钮
升级文本
默认使用的text旧文本,我们可以进行升级为textMeshPro
记得在程序集加入textMeshPro引用
修改
修改预制体的3个文本都为TextMeshPro
新增全屏覆盖的提示文本
将他放到最底部,确保它可以覆盖其他的UI
默认禁用
配置绑定
绑定当前启用的输入键
现在运行会会报错不允许我们绑定当前启用的输入键
修改代码,在绑定时先禁用当前输入,绑定完成或取消绑定再启用输入
效果
禁用一些按钮的绑定和退出按键绑定状态
比如禁用鼠标 鼠标左键
绑定esc为退出按键绑定状态
重复绑定按钮问题
比如这样
修改
重置绑定重复按钮
比如现在冲锋和Dash分别绑定了Z和Q
我们将冲锋按钮修改为其他按键,再将攻击按钮修改为Z后,点击重置冲锋按钮,就会出现这样的问题
修改
效果,使用和前面一样的步骤,这样绑定的按钮就直接交换了位置
修改按钮绑定名字
我们不希望这里显示的按钮绑定名是默认的名字
添加两个变量
这时候变量还是不会在面板显示出来,我们需要修改绑定脚本
效果,面板显示了我们刚才创建的两个变量
勾选第一个为真才显示输入文本
修改
效果
修改实际生效
效果
绑定图标
例子默认给我们提供了脚本
不过它默认只提供了Xbox和ps4手柄
的图标,代码会根据控件路径分配对应图标
如果你不知道控件路径,可以点击这个T按钮显示具体路径,比如这里的rightTrigger对应图标,这样你就可以做很多自定义的事,比如修改键盘按钮绑定的图标
这里演示绑定Xbox图标
如果你不想找图标信息,也可以使用例子默认提供的图标信息,它给了我们两套图标,分别是Xbox和ps4的
绑定图标
修改完成尝试运行报错
这是因为我们需要在我们的预制件中添加一个图像,它需要准确地命名为ActionBindingIcon
我们添加它,设置好宽高,并默认关闭
效果
重置所有按钮
新增脚本
给按键和手柄绑定不同的参数(如果有多个设备的话)
记得绑定按钮重置事件
保存和加载我们的按键绑定
例子也默认给了我们一个保存加载脚本
查看脚本,实现其实很简单,它将我们的数据保存在一个名为bindings的json文件中,当我们禁用此脚本时,它将保存,当我们启用这个脚本时,它会加载
分别拖入脚本到我们的按键和手柄画布绑定
参考
https://www.youtube.com/watch?v=qXbjyzBlduY
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~