| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;using System.Runtime.InteropServices; // for DllImportusing AOT;using System;namespace WebGLSupport{    class WebGLInputMobilePlugin    {#if UNITY_WEBGL && !UNITY_EDITOR        [DllImport("__Internal")]        public static extern int WebGLInputMobileRegister(Action<int> OnTouchEnd);        [DllImport("__Internal")]        public static extern void WebGLInputMobileOnFocusOut(int id, Action<int> OnFocusOut);#else        /// <summary>        /// ID を割り振り        /// </summary>        /// <returns></returns>        public static int WebGLInputMobileRegister(Action<int> OnTouchEnd) { return 0; }        public static void WebGLInputMobileOnFocusOut(int id, Action<int> OnFocusOut) { }#endif    }    public class WebGLInputMobile : MonoBehaviour, IPointerDownHandler    {        static Dictionary<int, WebGLInputMobile> instances = new Dictionary<int, WebGLInputMobile>();        int id = -1;        private void Awake()        {#if !(UNITY_WEBGL && !UNITY_EDITOR)            // WebGL 以外、更新メソッドは動作しないようにします            enabled = false;#endif        }        /// <summary>        /// 押されたら、touchend イベントを登録する        /// </summary>        /// <param name="eventData"></param>        public void OnPointerDown(PointerEventData eventData)        {            if (id != -1) return;            id = WebGLInputMobilePlugin.WebGLInputMobileRegister(OnTouchEnd);            instances[id] = this;        }        [MonoPInvokeCallback(typeof(Action<int>))]        static void OnTouchEnd(int id)        {            var @this = instances[id];            @this.GetComponent<WebGLInput>().OnSelect();            @this.StartCoroutine(RegisterOnFocusOut(id));        }        static IEnumerator RegisterOnFocusOut(int id)        {            yield return null;  // wait one frame.            WebGLInputMobilePlugin.WebGLInputMobileOnFocusOut(id, OnFocusOut);        }        [MonoPInvokeCallback(typeof(Action<int>))]        static void OnFocusOut(int id)        {            var @this = instances[id];            @this.StartCoroutine(ExecFocusOut(id));        }        static IEnumerator ExecFocusOut(int id)        {            yield return null;  // wait one frame.            var @this = instances[id];            @this.GetComponent<WebGLInput>().DeactivateInputField();            // release            @this.id = -1;            instances.Remove(id);        }    }}
 |