| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 | #if UNITY_2018_2_OR_NEWER#define TMP_WEBGL_SUPPORT#endif#if TMP_WEBGL_SUPPORTusing UnityEngine;using TMPro;using WebGLSupport.Detail;using UnityEngine.UI;using System;namespace WebGLSupport{    /// <summary>    /// Wrapper for TMPro.TMP_InputField    /// </summary>    class WrappedTMPInputField : IInputField    {        TMP_InputField input;        RebuildChecker checker;        Coroutine delayedGraphicRebuild;        public bool ReadOnly { get { return input.readOnly; } }        public string text        {            get { return input.text; }            set { input.text = FixContentTypeByInputField(value); }        }        /// <summary>        /// workaround!!        /// when use TMP_InputField.text = "xxx"; is will set the text directly.        /// so, use InputField for match the ContentType!        /// </summary>        /// <param name="inText"></param>        /// <returns></returns>        private string FixContentTypeByInputField(string inText)        {            var go = new GameObject("FixContentTypeByInputField for WebGLInput");            go.SetActive(false);            var i = go.AddComponent<InputField>();            i.contentType = (InputField.ContentType)Enum.Parse(typeof(InputField.ContentType), input.contentType.ToString());            i.lineType = (InputField.LineType)Enum.Parse(typeof(InputField.LineType), input.lineType.ToString());            i.inputType = (InputField.InputType)Enum.Parse(typeof(InputField.InputType), input.inputType.ToString());            i.keyboardType = input.keyboardType;            i.characterValidation = (InputField.CharacterValidation)Enum.Parse(typeof(InputField.CharacterValidation), input.characterValidation.ToString());            i.characterLimit = input.characterLimit;            i.text = inText;            var res = i.text;            GameObject.Destroy(go);            return res;        }        public string placeholder        {            get            {                if (!input.placeholder) return "";                var text = input.placeholder.GetComponent<TMP_Text>();                return text ? text.text : "";            }        }        public int fontSize        {            get { return (int)input.textComponent.fontSize; }        }        public ContentType contentType        {            get { return (ContentType)input.contentType; }        }        public LineType lineType        {            get { return (LineType)input.lineType; }        }        public int characterLimit        {            get { return input.characterLimit; }        }        public int caretPosition        {            get { return input.caretPosition; }        }        public bool isFocused        {            get { return input.isFocused; }        }        public int selectionFocusPosition        {            get { return input.selectionStringFocusPosition; }            set { input.selectionStringFocusPosition = value; }        }        public int selectionAnchorPosition        {            get { return input.selectionStringAnchorPosition; }            set { input.selectionStringAnchorPosition = value; }        }        public bool OnFocusSelectAll        {            get { return input.onFocusSelectAll; }        }        public bool EnableMobileSupport        {            get            {                // [2023.2] Latest Development on TextMesh Pro                // https://forum.unity.com/threads/2023-2-latest-development-on-textmesh-pro.1434757/                // As of 2023.2, the TextMesh Pro package (com.unity.textmeshpro) has been merged into the uGUI package (com.unity.ugui) and the TextMesh Pro package has been deprecated.                // In this version, TextMeshPro is default support mobile input. so disable WebGLInput mobile support#if UNITY_2023_2_OR_NEWER                // return false to use unity mobile keyboard support                return false;#else                return true;#endif            }        }        public WrappedTMPInputField(TMP_InputField input)        {            this.input = input;            checker = new RebuildChecker(this);        }        public Rect GetScreenCoordinates()        {            // 表示範囲            // MEMO :            //  TMP では textComponent を移動させてクリッピングするため、            //  表示範囲外になる場合があるので、自分の範囲を返す            return Support.GetScreenCoordinates(input.GetComponent<RectTransform>());        }        public void ActivateInputField()        {            input.ActivateInputField();        }        public void DeactivateInputField()        {            input.DeactivateInputField();        }        public void Rebuild()        {#if UNITY_2020_1_OR_NEWER            if (checker.NeedRebuild())            {                input.textComponent.SetVerticesDirty();                input.textComponent.SetLayoutDirty();                input.Rebuild(CanvasUpdate.LatePreRender);            }#else            if (input.textComponent.enabled && checker.NeedRebuild())            {                //================================                // fix bug for tmp                // TMPの不具合で、正しく座標を設定されてなかったため、試しに対応する                var rt = input.textComponent.GetComponent<RectTransform>();                var size = input.textComponent.GetPreferredValues();                if (size.x < rt.rect.xMax)                {                    // textComponent の座標を更新                    var pos = rt.anchoredPosition;                    pos.x = 0;                    rt.anchoredPosition = pos;                    // caret の座標更新                    var caret = input.GetComponentInChildren<TMP_SelectionCaret>();                    var caretRect = caret.GetComponent<RectTransform>();                    caretRect.anchoredPosition = rt.anchoredPosition;                }                //==============================                // HACK : 1フレーム無効にする                // MEMO : 他にいい方法Rebuildがあれば対応する                // LayoutRebuilder.ForceRebuildLayoutImmediate(); で試してダメでした                input.textComponent.enabled = rectOverlaps(input.textComponent.rectTransform, input.textViewport);                input.textComponent.SetAllDirty();                input.Rebuild(CanvasUpdate.LatePreRender);                //Debug.Log(input.textComponent.enabled);            }            else            {                input.textComponent.enabled = true;            }#endif        }        bool rectOverlaps(RectTransform rectTrans1, RectTransform rectTrans2)        {            Rect rect1 = new Rect(rectTrans1.localPosition.x, rectTrans1.localPosition.y, rectTrans1.rect.width, rectTrans1.rect.height);            Rect rect2 = new Rect(rectTrans2.localPosition.x, rectTrans2.localPosition.y, rectTrans2.rect.width, rectTrans2.rect.height);            return rect1.Overlaps(rect2);        }    }}#endif // TMP_WEBGL_SUPPORT
 |