首页 > 其他分享 >ugui学习 - PC键盘输入

ugui学习 - PC键盘输入

时间:2023-08-01 23:56:15浏览次数:34  
标签:case CaretPos 键盘输入 TempEvent PC Length InputText ugui 光标

最终效果

 

实现的功能

a) 点击后显示了光标, 才能输入

b) 按esc, 退出输入, 光标会隐藏

c) 输入时, 内容加在光标后面

d) Backspace删除光标后的字符

e) Delete删除光标前的字符

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class MyInputField_PCInput : MyInputField_TextSelect, IPointerClickHandler, ISelectHandler, IDeselectHandler
{
    protected string m_InputText = "";

    protected bool m_InputFocus = false;

    protected override bool IsCaretShow()
    {
        return m_InputFocus; //有输入焦点的时候才显示光标
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (eventData.button != PointerEventData.InputButton.Left)
            return;

        var go = this.gameObject;
        if (EventSystem.current.currentSelectedGameObject == go)
            OnSelect(null);
        else
            EventSystem.current.SetSelectedGameObject(gameObject, eventData);
    }

    public void OnSelect(BaseEventData eventData)
    {
        m_InputFocus = true;
        m_CaretPos = m_InputText.Length;
        m_SelectPos = m_CaretPos;
        Input.imeCompositionMode = IMECompositionMode.On;
        CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this); //下一帧显示光标
    }

    public void OnDeselect(BaseEventData eventData)
    {
        m_InputFocus = false;
        Input.imeCompositionMode = IMECompositionMode.Auto;
        CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this); //下一帧隐藏光标
    }


    private Event m_TempEvent = new Event();

    protected override void OnProcessInput()
    {
        if (!m_InputFocus) return;

        while (Event.PopEvent(m_TempEvent))
        {
            if (EventType.KeyDown == m_TempEvent.rawType)
            {
                //修饰键包括: Ctrl, Alt, Shift, Cmd, CapsLock, Numeric, 功能键
                //功能键包含: 上下左右箭头, F1~F12, Backspace, Ins, Del, Home, End, Page Up/Down, PrintScreen
                //Win, Esc, Enter, Backspace, Delete不是修饰键也不是功能键

                switch (m_TempEvent.keyCode)
                {
                case KeyCode.LeftArrow: //左移光标
                    if (m_CaretPos > 0)
                    {
                        m_CaretPos--;
                        m_SelectPos = m_CaretPos;
                        CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this); //下一帧统一更新光标
                    }
                    break;
                case KeyCode.RightArrow: //右移光标
                    if (m_CaretPos < m_Text.text.Length)
                    {
                        m_CaretPos++;
                        m_SelectPos = m_CaretPos;
                        CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
                    }
                    break;

                case KeyCode.Backspace: //删掉光标前面那个字符
                    if (m_InputText.Length > 0 && m_CaretPos > 0) //光标前没字符不删
                    {
                        m_InputText = m_InputText.Remove(m_CaretPos - 1, 1);
                        m_Text.text = m_InputText;
                        m_CaretPos--;
                        m_SelectPos = m_CaretPos;
                        CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
                    }
                    break;
                case KeyCode.Delete: //删掉光标后面那个字符
                    if (m_InputText.Length > 0 && m_CaretPos < m_InputText.Length) //光标后没字符不删
                    {
                        m_InputText = m_InputText.Remove(m_CaretPos, 1);
                        m_Text.text = m_InputText;
                        if (m_InputText.Length > 0 && m_CaretPos > m_InputText.Length)
                        {
                            m_CaretPos = m_InputText.Length;
                            m_SelectPos = m_CaretPos;
                        }
                        CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
                    }
                    break;
                case KeyCode.Escape:
                    OnDeselect(null);
                    break;

                default:
                    if (m_TempEvent.functionKey)
                    {
                        Debug.Log($"keyCode:{m_TempEvent.keyCode}, ch:{m_TempEvent.character}");
                    }
                    else
                    {
                        char c = m_TempEvent.character; //拼音输入法时, 字符是中文
                        //Debug.Log($"ch:{c}, {(int)c}");
                        if (0 == c)
                        {
                            //按着ctrl和alt时输入, 值会为0
                            //character值为0的按键: F1~F12, Esc, CapsLock, Ctrl, Alt, Win, Cmd, 上下左右箭头, Insert, Del, Backspace, Home, End, Page Up/Down
                            //Tab键有character
                        }
                        else
                        {
                            switch (c)
                            {
                            case '\t': /* tab键 */
                                break;
                            case '\r': /* mac回车键 */
                            //case '\n': /* window回车键 */
                            case (char)3:
                                c = '\n';
                                break;
                            }

                            m_InputText = m_InputText.Insert(m_CaretPos, c.ToString());
                            m_Text.text = m_InputText;
                            m_CaretPos++;
                            m_SelectPos = m_CaretPos;
                            CanvasUpdateRegistry.RegisterCanvasElementForGraphicRebuild(this);
                        }
                    }
                    break;
                }
            }

        }
    }

}

 

InputField做了这边省略掉的:

a) 有文本选中时输入,输入内容会把选中的文本替换掉

b) 还在拼写中的中文, 会把拼音显示出来

c) ctrl+c复制, ctrl+v粘贴, ctrl+a全选, ctrl+x剪切等快捷键支持

 

标签:case,CaretPos,键盘输入,TempEvent,PC,Length,InputText,ugui,光标
From: https://www.cnblogs.com/sailJs/p/17588462.html

相关文章

  • 淘宝1688拼多多京东商品详情数据(H5端,PC端)高效对接API接口
    api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口,可以帮助API使用者更好地了解、使用和集成,同时帮助人们有效地维护它每个产品都需要使用手册,API也不例外在API领域,可以将设计视为服务器和客户端之间的协议进行建模API协议可以帮助内部和外部的利益相关......
  • 沁恒触摸主动屏蔽与互感模式PCB Layout说明
    沁恒MCU触摸按键主动屏蔽模式与互感模式Layout说明主动屏蔽模式      主动屏蔽模式是指利用MCU的专用引脚,启用屏蔽功能,对各触摸检测通道做隔离,主动屏蔽主要作用有:      1)减小电路板上的互电容,从而减小触摸传感器基础电容值,增加触摸相对变化率;  ......
  • DPC WATCHDOG VIOLATION
    蓝屏SmbCo10X64.syshttps://answers.microsoft.com/zh-hans/windows/forum/all/%e6%9c%80%e8%bf%91%e7%94%b5%e8%84%91%e6%80%bb/d228ea4b-3945-4b1c-8c98-b1b3823d0213https://answers.microsoft.com/zh-hans/windows/forum/windows_11-windows_install/%e8%93%9d%e5%b1%8f/......
  • 亚马逊云科技发布基于Amazon Graviton3E的Hpc7g和C7gn实例
    亚马逊云科技宣布两款基于最新一代自研芯片AmazonGraviton3E的新实例AmazonElasticComputeCloud(AmazonEC2)Hpc7g和AmazonEC2C7gn正式可用。 其中,Hpc7g实例专为计算和网络密集型高性能计算(HPC)工作负载而构建,让用户能够在多达数万个CPU核心的高性能计算集群中进行复杂的计算。......
  • CENTOS7下安装GRPC FOR CPP
    gRPC是一个高性能、开源和通用的RPC框架,面向移动和HTTP/2设计。目前提供C、Java和Go语言版本,分别是:grpc,grpc-java,grpc-go.其中C版本支持C,C++,Node.js,Python,Ruby,Objective-C,PHP和C#。gRPC基于HTTP/2标准设计,带来诸如双向流、流控、头部压缩、单TC......
  • 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC的pytorch环境的软件升级—
       aarch64架构CPU下Ubuntu系统环境源码编译pytorch-gpu-2.0.1版本X86架构CPU下Ubuntu系统环境源码编译pytorch-gpu-2.0.1版本如何拉取指定CPU架构并且指定ubuntu版本并且指定cuda和cudnn版本的docker镜像如何拉取指定CPU架构并且指定ubuntu版本并且指定cuda和cudnn版本......
  • VS2022 PCL库引用配置
    嫌麻烦的可以直接下载PCL1.13.1安装在D盘然后复制我的配置就行.VC++目录包含目录D:\PCL1.13.1\3rdParty\OpenNI2\Include;D:\PCL1.13.1\3rdParty\VTK\include\vtk-9.2;D:\PCL1.13.1\3rdParty\Qhull\include;D:\PCL1.13.1\3rdParty\FLANN\include;D:\PCL1.13.1\3rdParty\Ei......
  • ugui学习 - 自己实现InputField鼠标点击调整光标位置,拖拽修改选中区域
    效果 代码usingUnityEngine;usingUnityEngine.EventSystems;usingUnityEngine.UI;publicclassMyInputField_CaretDragOp:MyInputField_TextSelect,IDragHandler,IPointerDownHandler{publicvoidOnPointerDown(PointerEventDataeventData){......
  • ugui学习 - 自己实现InputField的文本选中
    效果 代码把光标闪烁拿掉了usingUnityEngine;usingUnityEngine.UI;[DisallowMultipleComponent][RequireComponent(typeof(CanvasRenderer))][RequireComponent(typeof(RectTransform))]publicclassMyInputField_TextSelect:MonoBehaviour,ICanvasElement{......
  • PCB layout,或称为PCB设计,是将电子元件和连接线路等布局到电路板上的过程。
    1.设计思路在进行PCBlayout前,需要明确电路板的设计目标、功能、性能指标等,按照最终需求来设计电路板的参数、尺寸和针脚安排等。2.元器件部署按照较理想的排列方式,分配和放置电子元件的位置和布局,也就是确定元器件的摆放位置、取向和连线顺序,配合特定的机械框架基本......