Unity3d流式加载资源文件

本文介绍如何使用Unity引擎从远程服务器下载资源包,并将其解压到本地存储资源路径。详细阐述了解压过程及清理压缩文件的操作,确保资源包能够顺利在Unity项目中使用。

using UnityEngine;

using System.IO;

using System.Collections;

using Ionic.Zip;

using System.Collections.Generic;

using System;

public class LoadCube : MonoBehaviour{

 private byte[] ab;

 private int nn;

 string path1;//减压后文件的位置

 string FileName = DateTime.Now.ToString("yyMMddHHmmssff") + ".zip"; 

void Start() {

 path1 = Application.dataPath + "/";//本地存储资源路径

 StartCoroutine(LoadSenceAsset("http://192.168.1.75:8000/resour.zip"));//服务器路径

 } 

IEnumerator LoadSenceAsset(string url) {

 WWW download = new WWW(url);

 yield return download; 

ab = download.bytes;

 FileStream cache = new FileStream(path1 + "/" + FileName, System.IO.FileMode.Create);

cache.Write(download.bytes, 0, download.bytes.Length); 

//关闭流 

cache.Flush();//等待文件写入成功后再执行下步

 cache.Close(); 

if (ab != null) { 

print("Success import"); 

Uncompress(path1 + FileName);

 } else {

 print("download falls");

 } } //解压下载资源包 

public void Uncompress(string filename) { 

ZipFile zip = new ZipFile(filename);

 foreach (ZipEntry entry in zip)//将资源包内的所有文件解压

 { 

entry.Extract(path1, ExtractExistingFileAction.OverwriteSilently); 

zip.Dispose();

 Debug.Log("解压成功"); 

DeleteFile(); 

}

 public void DeleteFile() { 

string delFile = path1 + FileName; Debug.Log(delFile);

 File.Delete(delFile);

 }

 IEnumerator DeleteFile(string kdk) { //等待资源解压成功后,删除资源压缩包

 yield return new WaitForSeconds(5f); 

string delFile = path1 + FileName; Debug.Log(delFile);

 File.Delete(delFile); }

}

Unity 中,`StreamingAssets` 文件夹是一个特殊的文件夹,用于存放运行时需要读取的原始资源文件。这些文件会**原封不动地打包到最终的应用程序中**(例如 Android 的 APK、iOS 的 Bundle、PC 的安装目录等),因此非常适合用来存放视频文件、配置文件、数据库等。 要在 Unity 中从 `StreamingAssets` 加载并播放视频文件,通常使用 `VideoPlayer` 组件来实现。下面详细介绍如何操作: --- ### ✅ 步骤一:准备 StreamingAssets 文件夹 1. 在 Unity 项目的 `Assets` 目录下创建一个名为 `StreamingAssets` 的文件夹: ``` Assets/StreamingAssets/ ``` 2. 将你的视频文件(如 `demo.mp4`)放入该文件夹。 > ⚠️ 注意:Unity 不会对这个文件夹内的内容进行任何处理或压缩,保留原始格式。 --- ### ✅ 步骤二:使用 VideoPlayer 播放 StreamingAssets 中的视频 以下是一个完整的 C# 脚本示例,展示如何加载并播放 `StreamingAssets` 中的视频文件。 ```csharp using UnityEngine; using UnityEngine.Video; public class PlayVideoFromStreamingAssets : MonoBehaviour { public GameObject videoPlane; // 用于显示视频的 GameObject(如 3D Plane 或 UI RawImage 所在物体) private VideoPlayer videoPlayer; private string videoPath; void Start() { SetupVideoPlayer(); } async void SetupVideoPlayer() { // 创建一个 GameObject 来挂载 VideoPlayer 组件 GameObject camera = Camera.main.gameObject; videoPlayer = camera.AddComponent<VideoPlayer>(); // 构建视频路径(必须使用 file:// 协议) videoPath = System.IO.Path.Combine(Application.streamingAssetsPath, "demo.mp4"); #if UNITY_ANDROID && !UNITY_EDITOR // Android 上无法直接通过 file:// 访问 .mp4 文件(因为是压缩在 APK 内部的) // 所以需要先复制到可访问路径或使用本地 URL videoPlayer.source = VideoSource.Url; // Android 上推荐使用 UnityWebRequest 下载后播放(见下方说明) #else videoPlayer.source = VideoSource.Url; #endif videoPlayer.url = videoPath; // 设置播放目标 if (videoPlane != null && videoPlane.GetComponent<RawImage>() != null) { videoPlayer.renderMode = VideoRenderMode.APIOnly; videoPlayer.targetTexture = new RenderTexture(1920, 1080, 24); videoPlane.GetComponent<RawImage>().texture = videoPlayer.targetTexture; } else { videoPlayer.renderMode = VideoRenderMode.MaterialOverride; videoPlayer.targetMaterialRenderer = videoPlane.GetComponent<Renderer>(); videoPlayer.targetMaterialProperty = "_MainTex"; } // 其他设置 videoPlayer.isLooping = true; videoPlayer.playOnAwake = false; // 订阅事件(可选) videoPlayer.prepareCompleted += (vp) => { Debug.Log("视频准备完成,开始播放"); videoPlayer.Play(); }; // 异步准备视频 videoPlayer.Prepare(); // 等待准备完成(也可用协程等待) while (!videoPlayer.isPrepared) { await System.Threading.Tasks.Task.Yield(); } Debug.Log("视频已准备就绪"); videoPlayer.Play(); } void OnDestroy() { if (videoPlayer != null && videoPlayer.targetTexture != null) { videoPlayer.targetTexture.Release(); Destroy(videoPlayer.targetTexture); } } } ``` --- ### 📌 关键点解释 | 项目 | 说明 | |------|------| | `Application.streamingAssetsPath` | 返回平台相关的路径:<br>- PC: `C:/.../AppName_Data/StreamingAssets`<br>- Android: `jar:file:///data/app/.../base.apk!/assets`(不能直接用 `file://`)<br>- iOS: `app bundle` 路径 | | `VideoSource.Url` + `videoPlayer.url` | 使用 URL 方式加载外部文件,适用于流式加载 | | `VideoRenderMode` | 控制视频渲染到哪里:<br>- `MaterialOverride`: 替换材质贴图(适合 3D 物体)<br>- `APIOnly`: 输出到 RenderTexture(配合 RawImage 显示) | | `Prepare()` | 异步准备视频,建议调用以避免卡顿 | --- ### ⚠️ 平台差异注意事项 #### 🔹 Android 特殊处理 由于 Android 的 `StreamingAssets` 是压缩在 APK 里的,**不能直接通过 `file://` 访问**。你有两种选择: ##### 方法 1:使用 `UnityWebRequest` 复制到持久化路径再播放 ```csharp using UnityEngine.Networking; IEnumerator CopyVideoFromStreamingAssets() { string sourcePath = System.IO.Path.Combine(Application.streamingAssetsPath, "demo.mp4"); string destPath = Application.persistentDataPath + "/demo.mp4"; if (!System.IO.File.Exists(destPath)) { UnityWebRequest www = UnityWebRequest.Get(sourcePath); yield return www.SendWebRequest(); if (www.result == UnityWebRequest.Result.Success) { System.IO.File.WriteAllBytes(destPath, www.downloadHandler.data); Debug.Log("视频已复制到: " + destPath); } else { Debug.LogError("复制失败: " + www.error); yield break; } } // 现在可以用 destPath 播放 videoPlayer.source = VideoSource.Url; videoPlayer.url = destPath; videoPlayer.Play(); } ``` 然后在 `Start()` 中调用: ```csharp StartCoroutine(CopyVideoFromStreamingAssets()); ``` ##### 方法 2:使用 AssetBundle 包裹视频(更复杂但灵活) --- ### ✅ 支持的视频格式 取决于平台解码器支持情况: | 平台 | 常见支持格式 | |------------|--------------------------| | Windows | MP4 (H.264), AVI, MOV | | macOS | MOV, MP4 | | Android | MP4 (H.264) | | iOS | MOV, MP4 | 建议统一使用 **MP4 + H.264 编码**确保兼容性。 --- ### ✅ 测试建议 - 在 PC 上测试前确保 `StreamingAssets/demo.mp4` 存在。 - Android 上必须使用 `UnityWebRequest` 或提前拷贝。 - 可以打印路径调试: ```csharp Debug.Log("StreamingAssets path: " + Application.streamingAssetsPath); ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值