Unity webgl js 弹出文件对话框

webgl平台的文件对话框,unity只提供了编辑器模式下的,导入dll打包后会报错。

思路:c#可以调用js的代码

通过DOM生成一个input file按钮,调用click可以弹出。

但是问题:

游览器安全设置,无法模拟点击file按钮,在console里面可以跳出对话框,但是代码调用没有办法执行,必须点击按钮。

unity用UGUI拼的Button,点击触发事件可以加,不想点击两次,只能做一个开关。

Button 的 PointerEnter , PointerExit 事件,调用js脚本add或者删除事件,给body注册input的执行事件。当移动鼠标到UGUI的button按钮时候,点击按钮,实际上点击在body上,执行回调就可以完成,可以实现点击一次,弹出框体。

初始化一次:利用js代码,生成input按钮

private string ReceiverObjName = "FileDialogReceiver";
        

Application.ExternalEval(@"
            let fileuploader = document.getElementById('fileuploader');
            if (!fileuploader) {
                fileuploader = document.createElement('input');
                fileuploader.setAttribute('style','display:none;');
                fileuploader.setAttribute('type', 'file');
                fileuploader.setAttribute('id', 'fileuploader');
                document.getElementsByTagName('body')[0].appendChild(fileuploader);
            }
            fileuploader.addEventListener('change',
                function () {
                    console.log('change');  
                    let file = this.files[0];
                    SendMessage('" + ReceiverObjName + @"', 'FileDialogResult', URL.createObjectURL(file));
                }
            );

            function SimuClickEvent()
            {
                fileuploader.click();
                console.dir(fileuploader);
                document.body.removeEventListener('click', SimuClickEvent);
             }

            ");

给按钮注册事件:

EventTriggerType.PointerEnter:

 Application.ExternalEval(@"
                    document.body.addEventListener('click',SimuClickEvent);
                    ");



 EventTriggerType.PointerExit:

 Application.ExternalEval(@"
                document.body.removeEventListener('click', SimuClickEvent);
                ");

在FileDialogReceiver物体上挂脚本FileDialogResult.cs,里面收到

endAction 在click的赋值,就可以了


        public void FileDialogResult(string fileUrl)
        {
            Debug.Log("dddddddddddddd:"+fileUrl);
            Debug.Log("this.endAction");
            if (this.endAction != null)
            {
                this.endAction(fileUrl);
            }
        }

 

你可能感兴趣的:(Unity_功能模块)