#if UNITY_2018_2_OR_NEWER #define TMP_WEBGL_SUPPORT #endif #if TMP_WEBGL_SUPPORT using UnityEngine; using TMPro; using WebGLSupport.Detail; using UnityEngine.UI; using System; namespace WebGLSupport { /// /// Wrapper for TMPro.TMP_InputField /// 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); } } /// /// workaround!! /// when use TMP_InputField.text = "xxx"; is will set the text directly. /// so, use InputField for match the ContentType! /// /// /// private string FixContentTypeByInputField(string inText) { var go = new GameObject("FixContentTypeByInputField for WebGLInput"); go.SetActive(false); var i = go.AddComponent(); 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(); 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()); } 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(); 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(); var caretRect = caret.GetComponent(); 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