Unity Binding冲突解决探究

主要参考:

  • 官方文档:Unity官方Input System手册与API
  • 本文节选自:【Unity学习笔记】第十二 · New Input System 及其系统结构 和 源码浅析

可能存在冲突的几种情况:

  1. 同一Action下不同binding引用同一个control,且都非组合绑定
    在这里插入图片描述

    • button action:仅触发一次performed
    • value action:触发多次performed,有几个相同control就触发几次
    • passthrough:同value(不过注意按键释放值归0时passthrough也会触发performed)
  2. 不同Action下引用同相同control,且都非组合绑定
    在这里插入图片描述

    • 不存在冲突(不论什么action type),会触发各自Action的performed
  3. 同一Action下不同binding引用同不同control
    在这里插入图片描述

    • button:仅触发一次performed
    • value:例如绑定了JKL,按下J不放时触发一次perforemed;继续按下KL不放,不触发;然后依次释放JK,则又会触发两次performed;最后释放L不触发performed。
    • passthrough:比如绑定JKL,每个键的按压释放都会触发一次performed。


    说明: 这种情况和组合绑定情况有些类似,比如jkl,(j,k,l)的任何组合都认定为不同值,都会触发value或passthrough的值变更触发performed(jkl变成全0时不触发value类型的performed,但passthrough依旧会)。

    但是对于value来说,似乎跟binding在Action中的顺序有关,比如上面jkl绑定,如果按lkj顺序释放是不触发performed的,就比较奇怪。

  4. 不同Action下引用同一个control,且binding复杂度不同
    在这里插入图片描述

    • 两action都设为value、button:
      • 单按space键,触发fireCube;
      • 按ctrl+space,触发fireSphere;overrideModifiedFirst=true时,space+ctrl也触发fireSphere。
    • 也就是触发了高复杂度的Action,低复杂度action不再触发,这对组合绑定的冲突都同样使用。
    • 不考虑passthrough的情况,否则结果无预期效果。
  5. 同一Action下不同binding引用同一个control,且冲突的binding复杂度不同
    在这里插入图片描述

    • 按ctrl+space只会触发一次fireSphere
    • 按space会触发一次fireSphere
    • 对于overrideModifiedFirst=true,按space不放后会触发一次fireSphere,但此时再按ctrl,不会再触发fireSphere
  6. 上面4和5的结合
    在这里插入图片描述

    • 只按space,fireCube和fireSphere都会触发一次,这满足上面2和5的结论
    • 但按ctrl+space, fireCube和fireSphere也都会触发一次,这与4的结论不符合。因为从4、5情况的冲突解决想法,如果有高复杂度的绑定被消费了,冲突的低复杂度绑定就不再消费了,所以6这种案例可能是未曾考虑的边界情况,或许是bug。

总结:
总之,不考虑上面 第6点 这种特列,当存在冲突,优先高复杂度binding触发action,其所包含的冲突control就不同时触发其他action了。

而非组合绑定时,action下绑定多个相同control的binding,是允许同时触发多次action的。不同Action下引用同相同control,也允许同时触发两个action的。这两种不属于触发冲突,是由用户来控制的。
在这里插入图片描述

而对于同一Action下不同binding引用同不同control,官方文档举了个例子,如同时绑定手柄的左右扳机键,同时扣动时,会进行消除歧义的操作:当动作尚未启动时,它将对具有非默认值的第一个输入做出反应。一旦接收到这样的输入,它将开始跟踪该输入的来源。在动作正在进行时,如果接收到来自当前正在跟踪的控件以外的输入,它将检查输入是否具有比当前正在跟踪的控件更大的幅度。如果是这样,动作将从当前控件切换到具有更强输入的控件。

而如果当前control存在冲突且非"最激活"的,就会略过defaultInteraction处理,所以对于上面 第3点,依次按下jkl后,如果先释放kl是不会触发action的,只有先释放j才会触发action,但之后哪个control能拿到"最激活"的control,似乎和action上binding的顺序有关。
在这里插入图片描述
考虑到源码中处理controlStateChange的代码比较乱,而且modified 组合绑定曾出现过大bug,目前还不能相信官方对于按键冲突的处理没有问题,所以在使用Action绑定时,尽量避免冲突的发生。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云ECS(CentOS镜像)安装docker

目录 1.前置条件 2.连接至ECS 3.yum软件包更新 4.安装docker前置所需软件包 5.添加docker 官方的 yum 软件源 6.安装docker 7.检测是否成功 8.配置阿里云镜像加速器 1.前置条件 在看本文前保证未安装过docker,或者安装过但是清理干净 如果多次安装失败过,…

C语言第五弹---分支语句(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 分支语句 1、if语句1.1、if1.2、 else1.3、 分支中包含多条语句1.4、嵌套if1.5、 悬空else问题 2、关系操作符3、 条件操作符总结 C语言是结构化的程序设计语言&…

优思学院|怎样制作优秀的标准作业流程(SOP)?

我相信你一定去过众所周知的麦当劳。它在世界各地都有许多分店。不知道你是否曾在不同地方的麦当劳尝试过他们的美食,但你可能会好奇,为什么无论在世界哪个角落,麦当劳的食物口味都如此一致?它们是如何确保全球各地分店都能提供同…

【C++】类和对象(上篇)

文章目录 🛟一、面向过程和面向对象初步认识🛟二、类的引入🛟三、类的定义📝1、类的两种定义方式📝2、成员变量命名规则的建议 🛟四、类的访问限定符及封装🍩1、访问限定符🍩2、封装…

Docker(九)Docker Buildx

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! Docker Buildx Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持 [Moby BuildKit] 提供的功能。提…

Unity中实现捏脸系统

前言 目前市面上常见的捏脸一般是基于BlendShapes和控制骨骼点坐标两种方案实现的。后者能够控制的精细程度更高,同时使用BlendShapes来控制表情。 控制骨骼点坐标 比如找到控制鼻子的骨骼节点修改localScale缩放,调节鼻子大小。 BlendShapes控制表…

PLC网关BL121PO 实现低成本的PLC接入OPC UA的解决方案

随着工业4.0的迅猛发展,人们深刻认识到在工业生产和生活中,实时、可靠、安全的数据传输至关重要。在此背景下,高性能的工业自动化数据传输解决方案——协议转换网关应运而生,广泛应用于工业自动化和数字化工厂应用环境中。 无缝衔…

Linux 命令大全 CentOS常用运维命令

文章目录 1、Linux 目录结构2、解释目录3、命令详解3.1、shutdown命令3.1、文件目录管理命令ls 命令cd 命令pwd 命令tree 命令mkdir 命令touch 命令cat 命令cp 命令more 命令less 命令head 命令mv 命令rm 命令ln 命令tail 命令cut命令 3.2、用户管理useradd/userdel 命令用户的…

51单片机LED点阵屏

LED点阵屏 LED点阵屏是一种由许多小型LED灯组成的矩阵式显示屏。这些LED灯可以是单色、双色或全彩的,它们排列成行和列的网格,可以根据需要点亮来显示图像、文字或动画等内容。LED点阵屏广泛应用于户外广告牌、室内显示、交通信号灯、电子价格标签和其他…

[小程序]基于token的权鉴测试

一、服务器配置 服务器基于flask,需要额外安装flask_jwt_extended包 from flask import Flask #导入Flask包 from flask import request from flask import jsonify #用来返回json消息 from flask_jwt_extended import create_access_token, jwt_requi…

Docker(十)Docker Compose

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! Docker Compose 项目 Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式…

轻松打卡:使用Spring Boot和Redis Bitmap构建高效签到系统【redis实战 四】

欢迎来到我的博客,代码的世界里,每一行都是一个故事 轻松打卡:使用Spring Boot和Redis Bitmap构建高效签到系统【redis实战 四】 引言(redis实战)前言回顾bitmap基本概念核心特性使用场景 为什么使用redis中的bitmap实现?1. 存储效…

探索全球DNS体系 | 从根服务器到本地解析

DNS 发展 DNS(Domain Name System)的起源可以追溯到互联网早期。 早期的挑战: 早期互联网主要通过IP地址进行通信,用户需要记住复杂的数字串来访问网站。 需求的催生: 随着互联网的扩大,更简单、易记的…

binary_search_tree的介绍与实现(二叉搜索树精美图示详解哦)

二叉搜搜索树 引言二叉搜索树的介绍二叉搜索树的实现框架默认成员函数构造析构赋值重载 InsertR(插入)EraseR(删除)SearchR(查找) 源码概览总结 引言 在C语言部分,我们已经认识了树与二叉树的结…

如何进行正确的 CodeReview

软件开发生命周期中至关重要的一步是代码审查。它使开发人员能够显著提升代码质量。它类似于书籍的创作过程。首先,作者写故事,然后经过编辑以确保不会出现诸如混淆“you’re”和“yours”之类的错误。在这个语境中,代码审查指的是检查和评估…

GPT应用程序的行业应用

GPT(Generative Pre-trained Transformer)应用程序在各个行业都有广泛的应用潜力,其自然语言生成的能力使其适用于多种场景。以下是一些行业中常见的GPT应用,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件…

【明道云】学习笔记1-了解APaaS

【背景】 APaaS (Application Platform As A Service) ,即应用程序平台即服务,这是基于PaaS(平台即服务)的一种解决方案,支持应用程序在云端的开发、部署和运行,提供软件开发中的基础工具给用户&#xff0…

React Hooks 源码解析:useEffect

React Hooks 源码解析(4):useEffect React 源码版本: v16.11.0源码注释笔记:airingursb/react 1. useEffect 简介 1.1 为什么要有 useEffect 我们在前文中说到 React Hooks 使得 Functional Component 拥有 Class Component 的…

三维重建(4)--三维重建与极几何

目录 一、三维重建基础 1、线性解法 2、非线性解法 3、多视图几何的关键问题 二、极几何 1、极几何关系 2、极几何特例 3、本质矩阵 4、本质矩阵的性质 5、基础矩阵 6、基础矩阵的性质 7、基础矩阵的作用 三、基础矩阵估计 1、八点法 2、归一化的八点法 四…

138.随机链表的复制(附带源码)

目录 一、思路分析 二、如何操作 三、源码 深拷贝:原封不动的拷贝一份 一、思路分析: 这一题,偏向于技巧性。如果是按照工科思维硬推,那会非常头大,脑袋瓜疼。 这一题目的核心难点在于:处理random指针…