Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑

这篇具有很好参考价值的文章主要介绍了Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近学习了一下Unity InputSystem。该系统可用于实现、管理复杂的操作逻辑,上限很高。但由于它有一定的学习成本,导致一些和我一样的小白一入门时不得要领。之前卡住我的一个需求就是通过InputSystem 实现同一按键单击、双击、长按执行不同逻辑。例如点击单位执行攻击、双击单位选中所有同类单位、长按单位查看信息。现在想到了相对合理的方式,在此记录并分享。

InputSystem的官方示例提供了4种使用方法,即官方示例“Simple Demo”中提到的4种:

  1. SimpleDemo_UsingState
  2. SimpleDemo_UsingActions
  3. SimpleDemo_UsingActionAsset
  4. SimpleDemo_UsingPlayerInput

其中后两种是我认为的官方推荐的正式用法,我使用的是第三种,即使用了ActionAsset但没有使用PlayerInput的实现方式。

我的测试目标是在单击、双击、长按时在Unity控制台打出不同的log,且一次操作不会出现两次执行log。ActionAsset配置如图:
Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑
这里有三点注意事项:

  1. 虽然我们关注的操作有3种(单击、双击、长按),但由于是同个按键,所以应设为一个Action,即截图中的唯一的Action:“Tap”。
  2. 虽然我们关注的操作有3种(单击、双击、长按),但显然双击与单击的操作是有特殊关系的,实际的逻辑应该是单击后等待片刻若无第二次点击才执行单击的逻辑。所以这里我们在Interactions中只添加了“Hold”和“Multi Tap”这两种。其他设置保持默认。
  3. “Hold”和“Multi Tap”在图示Interactions列表中的顺序是影响其执行逻辑的,建议保持图示顺序。

测试代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem.Interactions;

public class TictactoeControl : MonoBehaviour
{
    private TictactoeAction InputActions;
    private void Awake()
    {
        InputActions = new TictactoeAction();
        InputActions.TestMap.Tap.started += ctx =>
        {
            Debug.Log("操作开始");
        };
        InputActions.TestMap.Tap.performed += ctx =>
        {
            if (ctx.interaction is MultiTapInteraction)
            {
                Debug.Log("执行双击逻辑");
            }
            else if (ctx.interaction is HoldInteraction)
            {
                Debug.Log("执行长按逻辑");
            }
            else
            {
                //列表中只有MultiTapInteraction和HoldInteraction对应的两种Interaction。
                //故不会走到这个else里。
            }
        };
        InputActions.TestMap.Tap.canceled += ctx =>
        {
            if (ctx.interaction is MultiTapInteraction)
            {
                Debug.Log("执行点击逻辑");
            }
        };
    }
    void Start()
    {
        
    }
    void Update()
    {

    }
    public void OnEnable()
    {
        InputActions.Enable();
    }
    public void OnDisable()
    {
        InputActions.Disable();
    }
}

我贴了测试脚本的完整代码,我们主要关注Awake()方法中的内容。

当我们设置的“Tap”Action执行时,会调用InputActions.TestMap.Tap.performed,这里要根据它执行时是通过哪个Interaction执行的(Hold 或 MultiTap)。区分后分别执行对应的逻辑即可。

当“Tap”Action取消时,会调用InputActions.TestMap.Tap.canceled,我们在此处判断一下是否是 MultiTap的取消,若是,则执行单击的逻辑。若之前Interactions列表的顺序和图示不一致,则此处执行单击逻辑的时机也会不一致。可能出现单击后不执行却在长按的时候执行的情况。

测试结果如图:
Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑
我在图示这次测试时先长按了一次,松手后进行了双击,最后进行了一次单击。可以看到三种操作分别独立地执行了,没有出现缺失或是混淆单击、双击的问题。(每次操作出现多次“操作开始”是因为我们配置了不止一种Interaction,在它们之间切换时会执行多次InputActions.TestMap.Tap.started。这个特性当前需求下可以忽略,也可利用起来实现其他功能。)

我使用的这种方式很可能不是最合理的甚至可能是多次一举的,欢迎指正、讨论。如果我发现了新的相关技巧,也会在此更新。

====================================================
2022.03.21更新
上文提到的InputSystem的几种回调(started、performed、canceled)在部分机型(华为折叠屏某款)、模拟器(网易mumu)会失效,原因不明。可使用每帧读取操作状态的方式实现同等功能。

例如:

InputActions.TestMap.Tap.ReadValue<float>();

点击、长按等Button类型的操作要读float类型的值,值为 1f 表示“有操作”,0f 表示“无操作”。
(我实际上很不理解这里为什么不是读bool值,所以怀疑这种每帧读值的方案不是标准方案。)文章来源地址https://www.toymoban.com/news/detail-445818.html

到了这里,关于Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Unity知识点详解】Button点击事件拓展,单击、双击、长按实现

    Button拓展         今天来聊一下关于Button的事件拓展,这里只是拿Button来举例,Unity中其他的UI组件如Toggle、Slider等都也适用。         我们知道在Button中我们可以通过onClick的方式来添加点击事件,但在游戏开发过程中我们往往对Button有着更多的功能需求,比如说双击、

    2024年04月10日
    浏览(42)
  • Unity 单击、双击、长按事件处理

    想要一个工具,能够同时集成单击、双击、长按的功能 通过IPointerDownHandler, IPointerUpHandler, IPointerClickHandler这三个接口就可以监听点击状态,然后再通过不同的点击状态来处理相应的事件 由于可能同时存在多个事件,实际开发过程中会出现多余事件通知,如下: 同时拥有单击

    2024年02月11日
    浏览(46)
  • 【23物联网国赛样题第二套】单片机,CC2530单片机呼吸灯与按键控制--单击双击长按、呼吸灯与亮度维持,物联网竞赛今年历年国赛样题真题代码

    【23物联网国赛样题第二套】单片机,CC2530单片机呼吸灯与按键控制--单击双击长按、呼吸灯与亮度维持,物联网竞赛今年历年国赛样题真题代码

    ZigBee节点盒通电或重置,节点盒的LED1、LED2灯都不亮。 长按SW1键不松开,LED1灯亮,LED2灯熄灭。 松开SW1键,LED1、LED2亮灯都常亮。 双击SW1可以控制LED1灯实现呼吸灯效果,LED2灯保持熄灭状态。 再次双击SW1可以控制LED1维持当前亮度不再发生变化,LED2继续保持熄灭状态。 将编写

    2024年02月08日
    浏览(49)
  • 用STM32单击按键实现LED闪烁和双击按键实现LED呼吸灯效果

    在嵌入式系统中,按键和LED是最常见的外设之一。本文将介绍如何使用STM32微控制器实现按键的单击和双击检测,并通过控制LED的闪烁和呼吸灯效果来呈现按键的触发效果。 第一部分:硬件准备 准备一块STM32开发板,如STM32F103C8T6。 连接一个按键到开发板上的GPIO引脚,并通过

    2024年02月05日
    浏览(24)
  • 「Python|Selenium|场景案例」如何模拟鼠标单击、双击、右击、长按和拖拽等操作?

    「Python|Selenium|场景案例」如何模拟鼠标单击、双击、右击、长按和拖拽等操作?

    本文主要介绍如何在使用selenium进行自动化测试的时候模拟各种鼠标操作。 在进行自动化测试的时候,我们可能会需要需要进行鼠标操作的场景,比如: 测试右击,查看是否网页是否屏蔽了右键菜单 面对滑块式登录验证方式,模拟拖拽 模拟前进或后退等鼠标扩展操作 ……

    2023年04月08日
    浏览(14)
  • Unity3D实现UI的单击、双击、拖动状态判断

    Unity3D实现UI的单击、双击、拖动状态判断

    这篇文章就来实现UI的单击、双击、按压、拖动的不同状态判断。不定时更新Unity开发技巧,觉得有用记得一键三连哦。 示例、 判断单击和双击,主要是判断点击的次数。 UI的点击事件,需要继承UI的点击事件接口,重写点击事件即可。 UI点击事件接口: 3-1-1 所引用的命名空

    2024年01月20日
    浏览(51)
  • [Unity案例]Button的双击和长按

    [Unity案例]Button的双击和长按

    实现内容: 扩展Unity自带的Button组件,在原有的单击事件的基础上实现双击和长按效果; 替换Button组件,通过单选框选择当前执行哪一种事件 代码详解: 单击事件处理: 通过 singleClickEnabled 开关控制是否启用单击事件。 在 OnPointerClick 方法中,根据按钮的激活状态和可交互

    2024年04月26日
    浏览(10)
  • unity鼠标单击物体与双击物体触发不同的事件

    unity鼠标单击物体与双击物体触发不同的事件

    下面举例在unity里面Canvas下面添加一个image,当鼠标移动到image点击一次触发事件 Debug.Log(“SingleClick!”);当鼠标在image点击两次触发事件 Debug.Log(“DoubleClick!”);鼠标双击和单机出现不同的响应事件 在Canvas或者需要点击的父物体上添加组件EventTrigger,打开 Add New Trigger 的菜单,添

    2024年02月11日
    浏览(48)
  • 【虚拟仿真】Unity3D中实现UI的单击、双击、按压、拖动的不同状态判断

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 之前写了一篇在Unity中鼠标的单击、双击、拖动的文章:

    2024年02月06日
    浏览(11)
  • 两种方式实现css取消页面鼠标双击选中文字或单击拖动选中文字的效果

    两种方式实现css取消页面鼠标双击选中文字或单击拖动选中文字的效果

    我们知道浏览器页面上的文字正常情况下我们是可以双击选中、或者单击鼠标横向拖动也能选中的,选中以后可以右击出现面板然后去复制什么的。但是有的时候,这种效果我们并不想要的,比如用户点快了的时候,所以我们需要禁用这种效果,本文记录一下禁用选中效果的

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包