要解决Linux系统输出的uinty程序输入框无法输入中文的问题我们需要考虑以下几点:
1.安装虚拟机搭建Linux系统环境:
2.安装Linux系统中的unity版本,推荐下载地址如下:
Unity Hub v.1.6.0 is now available - Unity Forum
此处需要说明一下,如何在Linux系统配置Unity开发环境:
1.需要 Linux 发行版上安装 .NET环境
2.选择合适的脚本编辑器,此处我用的是vscode,如果有其他的也可以尝试只要方便使用即可
3.开发
1.明确目的:内置中文输入法
需要解决核心问题是如何将拼音转化为中文,查阅资料选择 C#开发的NPinyin库
2.UI制作
这里我模仿的是sogou的输入风格,后续考虑添加换肤换字体相关升级
3.脚本控制
1.输入控制
此处需要处理的就是当我们的输入框获得焦点时将输入控制权交给我们的全局控制脚本
sing System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ChineseInput : MonoBehaviour
{
public InputField m_Input;
void Start()
{
m_Input = GetComponent<InputField>();
}
void Update()
{
if (m_Input.isFocused && ChineseInputManager.Instance.NowInputMode == InputMode.Chinese)
{
ChineseInputManager.Instance.gameObject.SetActive(true);
ChineseInputManager.Instance.NowInput = this;
ChineseInputManager.Instance.OldValue = this.m_Input.text;
ChineseInputManager.Instance.ChineseInput.ActivateInputField();
}
}
}
2.输入拼音转为汉字
利用C#开发的NPinyin库将拼音转为汉字并存储到数组中,方便后续选取
if (NowInput != null && !SetChineseChar)
{
NowInput.m_Input.text = OldValue + value;
NowPinYinStr = value;
NowChinese = NPinyin.Pinyin.GetChineseText(NowPinYinStr);
if (NowChinese.Length > 0)
{
NowChineseChar = NowChinese.ToCharArray();
TotalPage = Mathf.FloorToInt((NowChineseChar.Length - 1) / AllChineseShowBtns.Count) + 1;
NowPage = 1;
ShowChineseBtn();
}
else
{
foreach (var item in AllChineseShowBtns)
{
item.gameObject.SetActive(false);
}
}
}
3.汉字替换原有拼音并反馈到输入框
中文选中是替换原来的拼音输入段
public void UsingChinese()
{
if (NowInput != null)
{
NowInput.m_Input.text = OldValue + nowSelectChinese;
SetChineseChar = true;
ChineseInput.text = "";
//NowInput.m_Input.ActivateInputField();
NowPinYinStr = "";
NowChinese = "";
SetChineseChar = false;
OldValue = NowInput.m_Input.text;
if (!ChineseInput.isFocused)
{
ChineseInput.ActivateInputField();
}
}
foreach (var item in AllChineseShowBtns)
{
item.gameObject.SetActive(false);
}
Up.gameObject.SetActive(false);
Down.gameObject.SetActive(false);
}
4.输入法界面上下翻页,快速选中汉字
此处处理起来比较麻烦,输入的控制不能影响到拼音的改变.用到的思想是有功能键输入时使记录拼音的input丢失焦点,避免值发生改变
if (Input.GetKeyDown(KeyCode.Minus))
{
if (ChineseInput.isFocused)
{
ChineseInput.DeactivateInputField();
}
if (Up.gameObject.activeSelf)
PageUp();
}
if (Input.GetKeyDown(KeyCode.Equals))
{
if (ChineseInput.isFocused)
{
ChineseInput.DeactivateInputField();
}
if (Down.gameObject.activeSelf)
PageDown();
}
if (Input.GetKeyDown(KeyCode.Alpha1))
{
if (!ChineseInput.isFocused)
{
if (AllChineseShowBtns[0].gameObject.activeSelf)
{
AllChineseShowBtns[0].MyButton_Click();
}
}
}
5.中英切换
提炼输入模式,快捷键控制中英切换
if (Input.GetKeyDown(KeyCode.LeftControl))
{
if (NowInputMode == InputMode.Chinese)
{
if (NowInput != null)
{
ChangeBtn_Click(ChangeBtn.GetComponent<ChangeModeBtn>());
NowInput.m_Input.ActivateInputField();
}
}
}
4.发布测试
相关测试视频
链接:https://pan.baidu.com/s/15LegeCys-Kc8Zm7dOGaJdg?pwd=52mm
提取码:52mm
4.总结如下:
最后,遇到问题我们不妨先翻阅资料,仔细查看.看看是否已经有很好的解决方案,如果有,不妨拿来学习,没有的话就结合自身技术探索其他的解决方案,并做出相应的总结,相信每一次问题的解决就是自身能力的累积.第一次写技术总结博客,表达不是很清晰希望以后继续努力.
查阅的相关资料:
在 Linux 发行版上安装 .NET - .NET | Microsoft Learn
Unity3d C# UGUI实现中文输入法支持中英文切换功能(含工程源码)_十幺卜入的博客-CSDN博客_unity输入法