Unity3d C# UGUI实现中文输入法支持中英文切换功能(含工程源码)

前言

上一章我们实现了“Unity3d C# UGUI制作内置键盘带输入功能(含工程源码)”,本篇文章主要在前者的基础上进行开发,如果没看过前者,建议先看一眼。仅支持英文的输入,实际意义不是很大。经过一段时间的研究,实现了中文输入的功能。

效果

输入效果:

在这里插入图片描述

中英切换:
在这里插入图片描述

实现

中文输入比较麻烦,如何将拼音转换为汉字这个是最大的难点,自己开发还是算了,在网上逛了一段时间发现了hyjiacan.py4n(https://gitee.com/hyjiacan/Pinyin4Net) 这个好东西,是开源的库,其中就有拼音转文字的功能,就实现了中文的输入。键盘的样式和之前的一样,不过中文的输入,先通过输入的拼音输入转汉字,通过选择汉字完成输入,如果是数字和符号直接输入。
所以在上一篇的基础上加了很多中英状态的判定和处理。

键盘UI

中英的键盘基本是一直的,这里的布局我们参照中文的手机输入法,在上面加了汉字备选项,同时还有当前的拼音显示:
在这里插入图片描述

拼音转汉字

Pinyin4Net.GetHanzi("ai", false);

在输入拼音变动时,通过GetHanzi接口获取备选汉字,同时更新。

语言切换

        //语言点击事件
        private void ClickLanguage()
        {
            isCn = !isCn;
            if (isCn)
            {
                LanText.text = "中/<color=#9A9A9A>En</color>";
                CnObj.SetActive(true);
                ClearCnPinYin();
            }
            else
            {
                LanText.text = "En/<color=#9A9A9A>中</color>";
                CnObj.SetActive(false);
            }
        }

按键输入

        //输入内容追加
        public void AddComBtnString(string str)
        {
            if (!isCn)
            {
                NewEditeString += str;
                if (KeyboardPara != null)
                    KeyboardPara.OutputStr = NewEditeString;
                call?.Invoke(KeyboardPara);
                if (isShift && !isShiftLock)
                {
                    isShift = false;
                    ShiftBG.color = new Color(128, 128, 128, 255);
                    OnShiftOff();
                }
            }
            else {
                Regex reg = new Regex(@"[a-zA-Z]+");
                if (reg.IsMatch(str))
                { //纯字母
                    PinYinStr += str;
                    PinYinText.text = PinYinStr;
                    HanZiArr = Pinyin4Net.GetHanzi("ai", false);
                    UpdateHanZi();
                }
                else {
                    NewEditeString += (HanZiArr.Length > 0 && HanZiArr[0] != null) ? (HanZiArr[0] + str) : str;
                    if (KeyboardPara != null)
                        KeyboardPara.OutputStr = NewEditeString;
                    call?.Invoke(KeyboardPara);
                }
            }
        }

这里中文状态下的输入非a-z 和A-Z,将会直接输入,不然将作为拼音,获取更新汉字备选项。

选定汉字

        //点击汉字
        public void ClickHanZi(Text hz) {
            NewEditeString += hz.text;
            if (KeyboardPara != null)
                KeyboardPara.OutputStr = NewEditeString;
            call?.Invoke(KeyboardPara);
            ClearCnPinYin();
        }

Text对象的点击函数,直接追加Text的值为输入内容。

汉字换页

        //点击上一页
        public void ClickLast()
        {
            if (NowPage > 0)
                UpdateHanZi(--NowPage);
        }

        //点击下一页
        public void ClickNext() {
            if (NowPage < TotalPage)
                UpdateHanZi(++NowPage);
        }

根据页面编号刷新汉字备选项。

项目源码

https://download.csdn.net/download/qq_33789001/86059001

总结

目前使用的感觉肯定没有商用的输入法好用,因为仅支持单字打字,没有个人的偏好、兴趣的设置,也没有使用频率等信息,所以打起来体验相差较大。但是输入的功能已经完成,字库也算比较全的,基本功能算是够用。如果接入拼音转文字的接口可能效果会很好,但是离线状态下没法使用。

  • 12
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
实现一个item列表可以通过 Unity3D 中的UGUI组件来完成,以下是一个简单的实现步骤: 1. 创建一个ScrollView对象,它会成为你的item列表的容器。 2. 在ScrollView对象下创建一个Content对象,用于放置所有的item。 3. 创建一个item的Prefab,包你需要显示的元素。 4. 在运行时,动态生成多个item对象,将它们放置在Content对象下,以此来构建item列表。 5. 根据需要,可以对item列表进行滚动、添加或删除item等操作。 具体实现可以参考以下步骤: 1. 创建ScrollView和Content对象 在场景中创建一个空对象,命名为ScrollView。将Canvas组件的Render Mode设置为Screen Space - Overlay,然后将ScrollView对象的RectTransform组件的Anchors和Pivot都设置为(0, 0)。这样,ScrollView对象的左下角就会位于屏幕左下角。在ScrollView对象下创建一个空对象,命名为Content。将Content对象的RectTransform组件的Anchors和Pivot也都设置为(0, 0),以便于它能够与ScrollView对象的位置重合。 2. 创建item的Prefab 在项目资源中创建一个新的Prefab,将你需要显示的元素放入其中。例如,可以在Prefab中添加一个Text对象,用于显示item的标题。确保这个Prefab的RectTransform组件的Anchors和Pivot都设置为(0, 0),以便于在生成item时它们能够正确地布局。 3. 动态生成item对象 在脚本中,使用Instantiate()方法动态生成多个item对象,并将它们作为Content对象的子对象。例如: ```csharp public GameObject itemPrefab; public int itemCount = 20; void Start() { for (int i = 0; i < itemCount; i++) { GameObject item = Instantiate(itemPrefab, content.transform); // 设置item的位置和大小 item.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, -i * item.GetComponent<RectTransform>().rect.height); } } ``` 这段代码会生成20个item对象,将它们放置在Content对象下,并设置它们的位置和大小。这里假设item的高度是固定的。 4. 对item列表进行滚动 为了让item列表能够滚动,需要将ScrollView对象下的Scrollbar组件与Content对象的RectTransform组件相绑定。在ScrollView对象下添加一个Scrollbar组件,将它的Direction设置为Vertical,并将它的Size设置为0.2(或根据需要调整)。然后将Scrollbar组件的Value属性绑定到Content对象的RectTransform组件的anchoredPosition.y属性上。这样,当拖动Scrollbar时,Content对象就会相应地向上或向下滚动。 5. 添加或删除item 如果需要动态地添加或删除item,可以在脚本中使用Instantiate()和Destroy()方法来完成。例如: ```csharp public void AddItem() { GameObject item = Instantiate(itemPrefab, content.transform); // 设置新的item的位置和大小 item.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, -itemCount * item.GetComponent<RectTransform>().rect.height); itemCount++; } public void RemoveItem() { if (itemCount > 0) { Destroy(content.transform.GetChild(itemCount - 1).gameObject); itemCount--; } } ``` 这样,就可以在运行时动态地添加或删除item了。当添加一个新的item时,只需生成一个新的GameObject,并将它放置在Content对象下;当删除一个item时,只需销毁Content对象下的最后一个子对象即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十幺卜入

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值