Unity新版InputSystem短按与长按,改键的实现
目次媒介:
一、InputSystem简介
1.安装InputSystem包
2.创建设置文件
3.创建自界说的Actions
二、自界说输入类
三、改键
四、全代码
媒介:
新版inputsystem是Unity推出的一种新的输入方式,它将装备与举动举行分离,通过设置文件,更利于用户直接举行按键修改与设置。
https://i-blog.csdnimg.cn/direct/eb98d1868c7d494f88109bd5005d0ef2.png
一、InputSystem简介
这一部门告急是对InputSystem的简单先容,我会通过代码情势来举行按键逻辑的编写,由于代码更加机动。固然,假如是不复杂的项目,使用InputSystem内置的组件举行设置也是ok的,但这里就不会去先容这一部门的使用了。就简单放张图吧
https://i-blog.csdnimg.cn/direct/868a8c36cd3647a5b0c86176dbf20691.png
1.安装InputSystem包
起首到PackageManager里去安装包,然后会有提示框,举行重启就行。
https://i-blog.csdnimg.cn/direct/aa29aa3b004e4cb8a78383a15fec552a.png
到Edit=ProjectSetting里的Player中设置输入,固然可以使用Both,我这里用的是InputSystemPackage,Both就是会包罗旧版的InputManager,既然是讲InputSystem的,我就只用它了。
https://i-blog.csdnimg.cn/direct/3f389ad35ce341b78deb527f3308d28d.png
2.创建设置文件
鼠标右键Create-InputAction,就会创建一个设置文件,给它重定名都行。
https://i-blog.csdnimg.cn/direct/0be5eb6941f742a6ab6977443477af98.png
在InputAction文件中,可以天生C#类,它的路径,类命,定名空间都可以自界说,由于要使用脚原来处置惩罚短按长按逻辑,以是须要勾上天生C#类。
3.设置InputAction
点击InputAction文件中的Editasset按钮,就会进入下面的设置界面
https://i-blog.csdnimg.cn/direct/99a4f5bda7884417be652600a5241284.png
此中
https://i-blog.csdnimg.cn/direct/78dc6a6190f343ad8b1731fb653056d0.png
ActionMaps体现当前界说的 Action Maps 的列表。每个使用映射都是一组使用,您可以作为一个组一起启用或禁用这些使用。Actions体如今当前选定的 Action Map 中界说的全部使用,以及与每个 Action 关联的绑定。ActionProperties体现 Actions 面板中当前选定的 Action 或 Binding 的属性。此面板的标题会根据您在 Actions 面板中选择的是 Action 还是 Binding而发生厘革。有些不好明白是吧,现实呢,ActionMaps就像是一张表,这张表里有我们须要的一些使用,而且每个使用都有其对应的属性,这些属性可以是一个按钮,一个值。
3.创建自界说的Actions
https://i-blog.csdnimg.cn/direct/4716de8ff8854ba590694b6ee5f83954.png
轻微表明一下,这里呢我创建了一个名为Game的ActionMap,此中有一个叫做Tap的Action,它的举动范例是按钮。
Value提供一种连续状态厘革事故,假如设置了多个输入,就会切换到最告急的一个。用它举行模仿控制,好比移动。Button默认设置,包罗按钮大概按键触发的一次性动作Pass Through和Value很相似,但它不会像Value一样(假如有多个输入时,不会只选择最告急的谁人,而把其他的输入忽略)在使用Value大概Pass Through Types时,你会看到一个额外的选项 Control Type为该Value的返回值范例
https://i-blog.csdnimg.cn/direct/d371a04216e04537ac87d42a289d3b76.png
在Interactions一栏添加了一个Hold范例(长按范例)
Hold按下并按住至少设定的连续时间(默以为defaultHoldTime),则实举措作。(长按实行使用) MultiTap须要多次轻击(在tapTime内按下并开释),每次轻击之间的隔断不高出tapDelay秒(双击或多击)Press根据按钮的按下和开释次序来触发特定的使用(比方:在按下按钮后实行某个动作或在开释按钮时实行某个使用)SlowTap按下并按住控件一段时间后开释时实行使用(长按开释后实行使用)Tap按下并按住小段时间内开释实行使用(点击)而添加的绑定则是1DAxis,即假如输入的是负,则返回-1,输入的正则返回1,不输入则无,如许的绑定可以处置惩罚两个按键的逻辑。
https://i-blog.csdnimg.cn/direct/50860d7263ee44ef838c7896932ff5f4.png
当点击键盘A的时间返回-1,当点击键盘D的时间返回1。
设置好后,就可以生存文件,Unity会开始天生C#类。
https://i-blog.csdnimg.cn/direct/f8edbeae940944329c24673b44614a54.png
二、自界说输入类
https://i-blog.csdnimg.cn/direct/25e19dba62d44ce8bfc8cb17043c566b.png
inputControls就是天生的C#类,而Input则会是我们自界说得输入类。
短按很利益置惩罚,就只要在用户点击按钮的那一刻判断为点击就可
https://i-blog.csdnimg.cn/direct/aaebdc1c78454e58803a3b4d828670d5.png
而长按则须要用户进入到特定的时间点才气触发,而且它的逻辑也须要单独处置惩罚。
https://i-blog.csdnimg.cn/direct/f930a63fa84a44809c4d4a62e4f51d93.png
在按键检测过程中假如进入了长按交互,就开始举行判断是否是对应的按键。
编写测试脚原来测试一下
https://i-blog.csdnimg.cn/direct/8adde2d9b6c94286a0970158ac4835ca.png
测试结果:
https://i-blog.csdnimg.cn/direct/ee0b2164b5fb472a8ac1432ee43e7b66.gif
三、改键
InputSystem在设置输入时可以看到有绑定按键的使用,我们改键的使用就是通过代码来修改这个路径。点击旁边的T可以看到路径是什么。
https://i-blog.csdnimg.cn/direct/b7a3f813b8c34fef87cad94a1b40baff.png
打开天生的C#类可以在开头看到一段Json格式的代码,我们可以将其生存为Json文件,如许就可以做成长期的改键设置。思绪是云云,这里我就不做使用了,下面实现的将是直接修改按键的代码。
https://i-blog.csdnimg.cn/direct/b7f08f41db3949cfab77dac551baeec4.png
先上代码
https://i-blog.csdnimg.cn/direct/55f264fc294d4117aece668c7dc368a4.png
https://i-blog.csdnimg.cn/direct/055a5d9db2c0435483c5cca7d7ca285d.png
原理很简单,就是通过输入的按键,获取其路径,然后将绑定的path修改为新的改键路径。
ApplyBindingOverride函数中的index就是层级次序,下面标注出来次序
https://i-blog.csdnimg.cn/direct/d1f229eeeb1745fd87405a05144c873a.png
写个测试脚本:
https://i-blog.csdnimg.cn/direct/0f6a386ebc344f0c8903fdba72c30292.png
测试结果如下:
https://i-blog.csdnimg.cn/direct/2e808552325642fc8814722ce7244b86.gif
四、全代码
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Interactions;
public enum InputBindlingEnum
{
Left,
Right
}
public class Input
{
private InputControls actions;
public bool tap_left { get { return actions.Game.Tap.WasPressedThisFrame() && actions.Game.Tap.ReadValue<float>() == -1; } }
public bool tap_right { get { return actions.Game.Tap.WasPressedThisFrame() && actions.Game.Tap.ReadValue<float>() == 1; } }
public bool hold_left { get; private set; }
public bool hold_right { get; private set; }
public Input()
{
actions = new InputControls();
actions.Game.Tap.started += ctx =>
{
hold_left = false;
hold_right = false;
};
actions.Game.Tap.performed += ctx =>
{
if (ctx.interaction is HoldInteraction)
{
hold_left = actions.Game.Tap.ReadValue<float>() == -1;
hold_right = actions.Game.Tap.ReadValue<float>() == 1;
}
};
actions.Game.Tap.canceled += ctx =>
{
hold_left = false;
hold_right = false;
};
actions.Game.Enable();
}
public void ChangeBinding(InputBindlingEnum inputBindling, KeyCode key)
{
if (actions == null)
return;
if (actions.Game.enabled)
actions.Game.Disable();
InputBinding binding = new InputBinding();
switch (inputBindling)
{
case InputBindlingEnum.Left:
binding = actions.Game.Tap.bindings;
break;
case InputBindlingEnum.Right:
binding = actions.Game.Tap.bindings;
break;
}
string keyName = System.Enum.GetName(typeof(KeyCode), key);
if (keyName.Contains("Alpha"))
keyName = keyName.Substring(5);
else if (keyName.Contains("Keypad"))
keyName = keyName.Substring(6);
else if (keyName.Length > 1)
keyName = keyName.Substring(0, 1).ToLower() + keyName.Substring(1);
else
keyName = keyName.ToLower();
binding.overridePath = $"<Keyboard>/{keyName}";
switch (inputBindling)
{
case InputBindlingEnum.Left:
actions.Game.Tap.ApplyBindingOverride(1, binding);
break;
case InputBindlingEnum.Right:
actions.Game.Tap.ApplyBindingOverride(2, binding);
break;
}
#if UNITY_EDITOR
Debug.Log("成功绑定按键:" + inputBindling + ": from " + binding.path + " to " + binding.overridePath);
#endif
if (!actions.Game.enabled)
actions.Game.Enable();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private Input input;
private void Awake()
{
if (input == null)
input = new Input();
input.ChangeBinding(InputBindlingEnum.Left, KeyCode.LeftArrow);
}
private void Update()
{
if (input.tap_left)
{
Debug.Log("tap_left");
}
if (input.tap_right)
{
Debug.Log("tap_right");
}
if (input.hold_left)
{
Debug.Log("hold_left");
}
if (input.hold_right)
{
Debug.Log("hold_right");
}
}
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]