吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3288|回复: 6
收起左侧

[会员申请] 申请会员ID:gxguixin123【未报到,已注销】

[复制链接]
吾爱游客  发表于 2020-7-16 16:26
1、申 请 I D:a446198034
2、个人邮箱:446198034@qq.com
3、原创技术文章:

前言  


本人是前端开发工程师,从事VR、AR、Web、Window等平台软件开发,闲暇之余常来网站逛,特此申请


原创内容介绍


  Unity 实现 Web 端中文输入

效果演示


120611pzoqt5yu2y5tz8hx.gif


前景提醒

现阶段插件
image.png
实现效果太丑了!
image.png

换个角度来说可以利用 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)

其他原创作品展示


自定义模型绘制

自定义模型绘制





发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2020-7-16 18:20
换个其他账号吧,论坛禁止用QQ等联系方式当用户名一部分。
吾爱游客  发表于 2020-7-17 09:35
Hmily 发表于 2020-7-16 18:20
换个其他账号吧,论坛禁止用QQ等联系方式当用户名一部分。

这个可否

1、申 请 I D:gxguixin123
2、个人邮箱:446198034@qq.com
Hmily 发表于 2020-7-17 11:18
I D:gxguixin123
邮箱:446198034@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。
Hmily 发表于 2020-8-28 11:19
一直未报到,账号注销。
吾爱游客  发表于 2020-9-1 09:30
靓仔, id 通过后,我一直有在啊,很活跃的,经常浏览帖子,发帖回复
后来绑定了QQ,就一直用QQ登录,
今天看了下我的账号竟然登不上!
求给过呀

点评

规则很重要,还给你短消息通知来报道都没来,自己下次开放注册再来玩吧。  详情 回复 发表于 2020-9-1 10:09
Hmily 发表于 2020-9-1 10:09
ズZGあ☆ 发表于 2020-9-1 09:30
靓仔, id 通过后,我一直有在啊,很活跃的,经常浏览帖子,发帖回复
后来绑定了QQ,就一直用QQ登录,
今 ...

规则很重要,还给你短消息通知来报道都没来,自己下次开放注册再来玩吧。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 05:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表