1、申 请 I D:a446198034
2、个人邮箱:446198034@qq.com
3、原创技术文章:
前言
本人是前端开发工程师,从事VR、AR、Web、Window等平台软件开发,闲暇之余常来网站逛,特此申请
原创内容介绍
Unity 实现 Web 端中文输入
效果演示
前景提醒
现阶段插件
实现效果太丑了!
换个角度来说, 可以利用 html 原生元素,再跟 Unity 通信,就能完成中文输入!
Unity 与 Html 通信
[C#] 纯文本查看 复制代码 Application.ExternalCall(Js FunctionName, param,params ...);
Html 与 Unity 通信
[Asm] 纯文本查看 复制代码 SendMessage(Unity GameObj Name, FunctionName, param, param, ...);
有了通信的基础后,我们准备在 发布后的 html文件 封装一个输入框的事件
[Asm] 纯文本查看 复制代码 <div>
<input type="text" id = "SearchBoxInputId" name = "SearchBoxInputId" style="visibility:hidden;" />
</div>
这里,我们指明该输入框的id,且将其样式定义为隐藏, 并实现 "输入" 和 "失去焦点" 这两个重要方法
方法名称 | 方法作用 | 触发事件 | 等待 Unity 传来触发指令,激活输入框,并赋予其焦点,使中文得以输入 | OnInput (输入) | 将输入结果实时传回 Unity ,Unity 中可以处理 | onblur (失去焦点) | 鼠标点击输入框以外的位置都会自动触发此事件,此时将其隐藏,并通知 Unity |
[JavaScript] 纯文本查看 复制代码 <script>
//Control SearchBox ++
var UnityFunctionName = "";
function OnShowHTMLSearchBox(n)
{
UnityFunctionName = n;
var s = document.getElementById("SearchBoxInputId");
s.style.visibility = "visible";
s.style.opacity = 0; //透明化
s.focus(); //获取焦点
}
function LoseJiaoDian()
{
//文本框失去焦点
gameInstance.SendMessage(UnityFunctionName,"HtmlLoseForced");
var s = document.getElementById("SearchBoxInputId");
s.style.visibility = "hidden";
}
function OnSearchBoxInputing()
{
var s = document.getElementById("SearchBoxInputId");
//文本框正在输入
gameInstance.SendMessage(UnityFunctionName, "setSearchBoxString",s.value);
}
// Control SearchBox --
</script>
至此, html 就完成了对输入框的封装。
接下来来弄 Unity 这边的实现
- Unity 在 Inputfield 实现 PointDown 事件,即用户点击了输入框时,会首先触发该事件
- 实现一个方法,专门监听来自 html 发来的字符串
- 2 中的方法收到字符串后, 将 Inputfield 赋值,这样就会触发 Inputfield 的 OnValueChanged 事件,完成自己的需求
- 实现一个方法,专门监听 html 的 onblur 事件, 流程结束!
- 最重要的一点,unity 必须实现键盘锁定,否则在html 输入的时候会同时触发Unity 写好的快捷键事件
[C#] 纯文本查看 复制代码 WebGLInput.captureAllKeyboardInput = false;
Unity 处理
[C#] 纯文本查看 复制代码 public class SearchBox : MonoBehaviour
{
public InputField IF_SearchBox;
public Text T_ShowText;
//通知 html 激活输入框方法
string JsOnShowInputFun = "OnShowHTMLSearchBox";
// Use this for initialization
void Start()
{
#if UNITY_WEBGL && !UNITY_EDITOR
InitTrigger();
#endif
IF_SearchBox.onValueChanged.AddListener(SearchBoxOnValueChanged);
}
void InitTrigger()
{
EventTrigger trigger = IF_SearchBox.gameObject.GetComponent<EventTrigger>();
if (null == trigger)
trigger = IF_SearchBox.gameObject.AddComponent<EventTrigger>();
EventTrigger.Entry e = new EventTrigger.Entry();
e.eventID = EventTriggerType.PointerDown;
e.callback.AddListener((data) => { SearchBoxPointDownEvent((PointerEventData)data); });
trigger.triggers.Add(e);
}
#region UI Event
void SearchBoxOnValueChanged(string str)
{
T_ShowText.text = IF_SearchBox.text.ToString();
}
void SearchBoxPointDownEvent(PointerEventData data)
{
//通知html 激活输入框的同时,要禁用Unity 的键盘输入,否则按键会同时触发 Unity 写好的快捷键事件
#if UNITY_WEBGL && !UNITY_EDITOR
WebGLInput.captureAllKeyboardInput = false;
#endif
Application.ExternalCall(JsOnShowInputFun, gameObject.name);
}
#endregion
#region From Html
/// <summary>
/// html 输入框的输入事件
/// </summary>
/// <param name="str"></param>
public void setSearchBoxString(string str)
{
IF_SearchBox.text = str;
IF_SearchBox.caretPosition = IF_SearchBox.text.Length;
}
/// <summary>
/// html 输入框失去焦点
/// 此处重新激活键盘
/// </summary>
public void HtmlLoseForced()
{
#if UNITY_WEBGL && !UNITY_EDITOR
WebGLInput.captureAllKeyboardInput = true;
#endif
}
#endregion
}
流程结束
工程源码
WebGL中文输入.txt
(116 Bytes, 下载次数: 11)
其他原创作品展示
自定义模型绘制
|