当前位置: 首页 > news >正文

Unity webgl 获取图片或视频数据

WebFilePicker.jslib (放在Plugins目录)

var WebFilePickerLibrary = {/*** 从浏览器中获取文件并发送给 Unity WebGL 应用程序。* @param {number} objectNamePtr - Unity 对象名称的指针。* @param {number} funcNamePtr - Unity 回调函数名称的指针。* @param {number} fileTypePtr - 允许的文件类型字符串的指针。* @param {number} allowMultiple - 是否允许多选(1 表示允许多选,0 表示单选)。* @param {number} maxSizeMB - 文件大小限制(单位:MB)。如果 <=0,则无限制。*/getFileFromBrowser: function(objectNamePtr, funcNamePtr, fileTypePtr, allowMultiple, maxSizeMB) {var objectName = UTF8ToString(objectNamePtr);var funcName = UTF8ToString(funcNamePtr);var fileType = UTF8ToString(fileTypePtr);var maxSizeBytes = maxSizeMB > 0 ? maxSizeMB * 1048576 : 0;var input = document.createElement("input");input.type = "file";input.multiple = !!allowMultiple; // 转换为布尔值input.accept = fileType;input.style.display = "none";/*** 处理通用文件* @param {File[]} files - 用户选择的文件列表。*/var handleFiles = function(files) {var results = [];var filesProcessed = 0;for (let i = 0; i < files.length; i++) {const file = files[i];// 检查文件大小限制if (maxSizeBytes > 0 && file.size > maxSizeBytes) {SendMessage(objectName, funcName,`error:File '${file.name}' exceeds limit (${(file.size / 1048576).toFixed(1)}MB/${maxSizeMB}MB)`);return;}const reader = new FileReader();reader.onload = (e => {results.push({name: file.name,type: file.type,data: new Uint8Array(e.target.result)});filesProcessed++;// 所有文件处理完毕时发送结果if (filesProcessed === files.length) {var resultData = results.map(result => {return {name: result.name,type: result.type,data: Array.from(result.data)};});SendMessage(objectName, funcName, JSON.stringify(resultData));}});reader.readAsArrayBuffer(file);}};// 监听文件选择事件input.addEventListener('change', function(evt) {const files = evt.target.files;if (!files || files.length === 0) {SendMessage(objectName, funcName, "error:No file selected");return;}handleFiles(files);});// 触发文件选择对话框document.body.appendChild(input);input.click();document.body.removeChild(input);}
};mergeInto(LibraryManager.library, WebFilePickerLibrary);

WebFilePicker.cs

using System;namespace MYTOOL
{[Serializable]public class FileResult{public string name;     // 文件名称public string type;    // MIME 类型public byte[] data;    // 二进制数据}/// <summary>/// 提供与Unity WebGL平台交互的方法,用于从浏览器中获取文件(图片、视频或其他类型)/// </summary>public static class WebFilePicker{public const string IMAGE_FILE_TYPE = "image/*";public const string VIDEO_FILE_TYPE = "video/*";#if UNITY_WEBGL[System.Runtime.InteropServices.DllImport("__Internal")]private static extern void getFileFromBrowser(string objName, string methodName, string fileType, bool allowMultiple, int maxSizeMB);
#endif/// <summary>/// 从浏览器中获取图片文件/// </summary>/// <param name="objName">Unity对象名称</param>/// <param name="methodName">Unity回调方法名称</param>/// <param name="maxSizeMB">文件大小限制。如果为0则无限制</param>public static void GetImageFromBrowser(string objName, string methodName, int maxSizeMB = 0){GetFileFromBrowser(objName, methodName, IMAGE_FILE_TYPE, maxSizeMB);}/// <summary>/// 从浏览器中获取多个图片文件/// </summary>/// <param name="objName">Unity对象名称</param>/// <param name="methodName">Unity回调方法名称</param>/// <param name="maxSizeMB">文件大小限制。如果为0则无限制</param>public static void GetImagesFromBrowser(string objName, string methodName, int maxSizeMB = 0){GetFilesFromBrowser(objName, methodName, IMAGE_FILE_TYPE, maxSizeMB);}/// <summary>/// 从浏览器中获取视频文件/// </summary>/// <param name="objName">Unity对象名称</param>/// <param name="methodName">Unity回调方法名称</param>/// <param name="maxSizeMB">文件大小限制。如果为0则无限制</param>public static void GetVideoFromBrowser(string objName, string methodName, int maxSizeMB = 0){GetFileFromBrowser(objName, methodName, VIDEO_FILE_TYPE, maxSizeMB);}/// <summary>/// 从浏览器中获取任意类型的文件/// </summary>/// <param name="objName">Unity对象名称</param>/// <param name="methodName">Unity回调方法名称</param>/// <param name="fileType">文件类型</param>/// <param name="maxSizeMB">文件大小限制。如果为0则无限制</param>public static void GetFileFromBrowser(string objName, string methodName, string fileType, int maxSizeMB = 0){
#if UNITY_WEBGL && !UNITY_EDITORgetFileFromBrowser(objName, methodName, fileType, false, maxSizeMB);
#elseUnityEngine.Debug.LogError("only implemented for WebGL platform.");
#endif}/// <summary>/// 从浏览器中获取多个任意类型的文件/// </summary>/// <param name="objName">Unity对象名称</param>/// <param name="methodName">Unity回调方法名称</param>/// <param name="fileType">文件类型</param>/// <param name="maxSizeMB">文件大小限制。如果为0则无限制</param>public static void GetFilesFromBrowser(string objName, string methodName, string fileType, int maxSizeMB = 0){
#if UNITY_WEBGL && !UNITY_EDITORgetFileFromBrowser(objName, methodName, fileType, true, maxSizeMB);
#elseUnityEngine.Debug.LogError("only implemented for WebGL platform.");
#endif}}
}

使用:调用WebFilePicker里提供的方法,回调时返回json字符串,反序列化为FileResult即可拿到原始数据。
注意:mime_type => type
在这里插入图片描述
效果:
在这里插入图片描述

相关文章:

  • UI键盘操作
  • 机器学习+深度学习
  • 开发基于python的商品推荐系统,前端框架和后端框架的选择比较
  • 青少年编程与数学 02-016 Python数据结构与算法 30课题、数据压缩算法
  • 基于DeepSeek与Excel的动态图表构建:技术融合与实践应用
  • 平均池化(Average Pooling)
  • 【绘制图像轮廓】图像处理(OpenCV) -part7
  • Fastdata极数:全球AR/VR行业发展趋势报告2025
  • spring-batch批处理框架(1)
  • 面向新一代扩展现实(XR)应用的物联网框架
  • 【Matlab】中国沿岸潮滩宽度和坡度分布
  • PH热榜 | 2025-04-19
  • PHP+MYSQL开发一个简易的个人博客(一)
  • 第2期:控制流程语句详解(条件判断与循环)
  • LeetCode[459]重复的子字符串(KMP解法)
  • 聊聊Spring AI Alibaba的ElasticsearchDocumentReader
  • opencv图像旋转(单点旋转的原理)
  • linux oracle 19c 静默安装
  • 使用Redis实现实时排行榜
  • Redis(持久化)
  • 旧电梯换新如何分摊费用?低楼层可以不出钱吗?上海闵行举办讨论会
  • 网信部门持续整治利用未成年人形象不当牟利问题
  • 汕头22岁女子手术成功却意外脑死亡,家属称缺氧30分钟医生未发觉
  • 泰康资产获批设立全资私募基金管理子公司,首期投资规模预计120亿元
  • 二十届中央第五轮巡视完成进驻
  • 全年拟定脑机接口等9个主题,“张江论剑”科创沙龙启动