键盘绑定事件

键盘中的onkeydown和onkeypress的区别

onkeydown 事件是响应任意键按下的处理(包括功能键),onkeypress 事件只响应字符键按下后的处理。

event.keyCode和event.which的区别

Internet Explorer/Chrome 浏览器使用 event.keyCode 取回被按下的字符,而 Netscape/Firefox/Opera 等浏览器使用 event.which。

通过onkeydown获取用户按下键盘后的信息

<html>
<body>
<script type="text/javascript">
function noNumbers(e)
{
    var keynum;
    var keychar;
    keynum = window.event ? e.keyCode : e.which;
    keychar = String.fromCharCode(keynum);
    alert(keynum+':'+keychar);
}
</script>
<input type="text" οnkeydοwn="return noNumbers(event)" />
</body>
</html>
fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
通过JS来调用键盘事件

 <script type="text/javascript" language=JavaScript charset="UTF-8">
 2       document.οnkeydοwn=function(event){
 3             var e = event || window.event || arguments.callee.caller.arguments[0];
 4             if(e && e.keyCode==13){ // 按 Enter 
 5                 //要做的事情
 6               }
 7             if(e && e.keyCode==113){ // 按 F2 
 8                  //要做的事情
 9                }            
10         }; 
11 </script>

键码对照表






### 实现键盘事件绑定 为了实现在 Unity 中的键盘事件绑定,可以创建一个专门用于处理这些事件的管理器类 `KeyboardEventManager`。该类负责监听不同类型的按事件并调用相应的回调函数。 #### 创建 KeyboardEventManager 类 首先定义枚举来表示不同的按状态: ```csharp public enum KeyEventType { Pressed, Released, HeldDown, LongPress } ``` 接着构建核心逻辑部分,在 `KeyboardEventManager.cs` 文件中编写如下代码: ```csharp using System.Collections.Generic; using UnityEngine; public class KeyboardEventManager : MonoBehaviour { private Dictionary<KeyCode, List<(KeyEventType type, int priority, Action callback)>> keyBindings = new(); public void BindKey(KeyCode keyCode, KeyEventType eventType, int priority, Action callback){ if (!keyBindings.ContainsKey(keyCode)){ keyBindings[keyCode] = new(); } var bindingList = keyBindings[keyCode]; foreach (var item in bindingList.ToList()){ if(item.type == eventType && item.priority <= priority){ bindingList.Remove(item); } } bindingList.Add((eventType, priority, callback)); bindingList.Sort((a,b)=>b.priority.CompareTo(a.priority)); // Sort by descending order of priorities. } private void Update(){ foreach(var pair in keyBindings.ToArray()){ KeyCode code = pair.Key; bool isPressedThisFrame = Input.GetKeyDown(code); bool wasReleasedThisFrame = Input.GetKeyUp(code); foreach ((KeyEventType etype,int pri,Action cb) in pair.Value){ switch(etype){ case KeyEventType.Pressed when isPressedThisFrame: cb?.Invoke(); break; case KeyEventType.Released when wasReleasedThisFrame: cb?.Invoke(); break; case KeyEventType.HeldDown when Input.GetKey(code): cb?.Invoke(); break; case KeyEventType.LongPress when Time.frameCount % 60 == 0 && Input.GetKey(code): // Simplified long press detection cb?.Invoke(); break; } } } } /// <summary> /// Unbinds all events associated with a specific keycode and eventtype combination or just the one matching both parameters exactly. /// </summary> public void UnbindKey(KeyCode? keyCode=null, KeyEventType? eventType=null){ if(!keyCode.HasValue || !eventType.HasValue){ foreach(KeyValuePair<KeyCode,List<(KeyEventType,int,Action)>> kvp in keyBindings.Where(kvp => (!keyCode.HasValue || kvp.Key==keyCode) && (!eventType.HasValue || kvp.Value.Any(t=>t.Item1==eventType)))){ keyBindings[kvp.Key].RemoveAll(x=>!eventType.HasValue||x.type==eventType); } }else{ if(keyBindings.TryGetValue(keyCode.Value,out var list)) list.RemoveAll(x=>x.type==eventType); } } } ``` 此脚本实现了基本功能需求中的按事件统一管理和优先级控制[^1]。通过上述方法可以在场景内任意位置实例化此类对象,并利用其提供的接口完成具体业务逻辑所需的按响应设置。 对于输入框聚焦期间阻止某些默认行为的需求,则可在UI控件上附加额外组件或修改现有组件的行为以适应特定情况下的交互规则;而对于简化删除操作的要求,已经在上面给出的方法里有所体现——即提供了灵活方便地移除指定条件下的绑定关系的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值