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

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
在这里插入图片描述
效果:
在这里插入图片描述

http://www.xdnf.cn/news/494.html

相关文章:

  • 【unity】Vulkan模式下部分Android机型使用VideoPlayer组件播放视频异常问题
  • 交易系统的构建与实战法则
  • JCST 2025年 区块链论文 录用汇总
  • 电子电器架构 --- DFMEA设计失效模式和后果分析
  • 聊一聊接口自动化测试脚本如何进行维护的?
  • 齿轮检测中的“正负之谜”:为何有的项目有,有的没有?
  • C# 预定义类型全解析
  • Selenium 入门之环境搭建
  • `Accelerate`库实现模型并行计算
  • SAP系统工艺路线的分配物料出现旧版包材
  • 第6章 类文件结构《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》
  • [特殊字符] AI 大模型的 Prompt Engineering 原理:从基础到源码实践
  • Linux | 软件仓库管理
  • 回溯算法(3):番外篇
  • 机器学习决策树
  • GESP2025年3月认证C++八级( 第三部分编程题(2)割裂)
  • ICS丨Chapter 1 Introduction to Computer System
  • C++中chrono计时器的简单使用示例
  • CF1016赛后总结
  • 常见网络问题
  • 2025年第16届蓝桥杯嵌入式竞赛学习笔记(十四):RTC实时时钟
  • 算法--打表法
  • JS案例-基于Proxy的响应式数据
  • [密码学基础]国密算法深度解析:中国密码标准的自主化之路
  • 在已有的vue项目中使用vuex
  • 鸿蒙开发11-ARKUI框架
  • 谷歌称LLMs.txt类似于关键词元标签:SEO影响与应对策略
  • 提升电脑性能!Windows超级管理器,免费使用,功能全面!
  • 开启健康养生新旅程
  • 单片机毕业设计选题物联网计算机电气电子类