【问题标题】:Detect continous touch on GUI button检测 GUI 按钮上的连续触摸
【发布时间】:2016-03-29 05:15:08
【问题描述】:

以下代码用于实现退格按钮功能,该功能在 GUI 按钮 OnClick 下运行。

 public void BackSpace(InputField userField) {
        string textEnter = userField.text;
        string tempString = textEnter.Substring(0, textEnter.Length - 1);
        userField.text = tempString;
    }

它工作正常,一次单击一个按钮即可删除输入文本。问题是我想在用户连续按下 GUI 按钮时连续运行此功能,就像您的键盘退格按钮一样,但遗憾的是,这只能工作一次,因为 onClick 只能工作一次。是否有任何事件或技巧可用于检测 GUI 上的连续触摸以运行我想要的代码?

【问题讨论】:

  • 对于任何在这里使用谷歌搜索的初学者,这里有一篇文章解释了如何通过 UI.Button stackoverflow.com/a/36046495/294884987654321@ 之类的方式访问“其他”调用
  • 你绝对应该在这里使用 UnityEvent。使用 UnityEvent、Tap 创建一个名为 BetterButton 的脚本。要实现这两个概念,请使用下面的 Fafase 代码。然后将 BetterButton 附加到任何按钮以使其成为该类型的按钮。这里是“制作你自己的”UnityEvent 的解释,适用于任何在谷歌上搜索到这里的初学者stackoverflow.com/questions/36244660/…

标签: c# user-interface unity3d unity3d-ui


【解决方案1】:

您可能想查看 Selectable 事件系统。您可以实现 OnPonterDown 和 OnPointerUp 以便第一个设置触发,第二个停止它:

using UnityEngine.EventSystems;
public class Test : MonoBehaviour, IPointerDownHandler, IPointerUpHandler {
    [SerializeField]private InputField userField;
    #region IPointerUpHandler implementation
    private bool running =false;
    public void OnPointerUp (PointerEventData eventData)
    {
        running = false;
        if(timer < holdTime){ Tap(); }
        timer = 0.0f;
    }

    #endregion

    #region IPointerDownHandler implementation

    public void OnPointerDown (PointerEventData eventData)
    {
        running = true;
    }

    #endregion
    float timer = 0.0f;
    float holdTime = 0.25f;
    // Update is called once per frame
    void FixedUpdate () 
    {
        if(running){ 
           timer += Time.deltaTime;
           if(timer > holdTime)
                BackSpace();}
    }
    private void BackSpace() {
        string textEnter = userField.text;
        string tempString = textEnter.Substring(0, textEnter.Length - 1);
        userField.text = tempString;
    }
}

固定更新使其在不同设备上保持一致。您可以设置自己的更新系统来控制频率。

【讨论】:

  • 谢谢,我几乎写了相同的代码,但我卡在了字符串引用中
  • 我添加了方法,InputField变成了全局引用。
  • 感谢宝贵的更新,但现在的问题是单击删除多个输入字段项:(
  • 我只想通过 gui 按钮实现退格按钮功能,单点触摸和连续触摸都必须识别,但现在单点触摸删除多个文本项作为更新中编写的代码
  • 我做了一个快速更新。所以现在,如果你持有少于 0.25 秒,它是一个轻拍,否则它是一个持有。这意味着在发布时会发生点击。
【解决方案2】:

只是为了节省任何人的打字时间,这正是你的做法:

把这个脚本放在按钮上

您实际上还有一些其他脚本 (SomeScript),其中有一个切换开关。

复制粘贴!

using UnityEngine;
using UnityEngine.EventSystems;

public class HoldableButton: MonoBehaviour, IPointerDownHandler, IPointerUpHandler {

    bool _down;
    public SomeScript someScript;

    public void OnPointerDown(PointerEventData eventData) {
        _down = true;
    }

    public void OnPointerUp(PointerEventData eventData) {
        _down = false;
    }

    void Update() {

        someScript.yourToggle = _down;
    }
}

【讨论】:

    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多