版本:Unity 6(6000.0)
语言 英文
  • C#

AssetBundle.LoadFromStream

提出修改建议

成功!

感谢你帮助我们改善 Unity 文档质量。虽然我们无法接受所有提交,但我们会阅读用户提出的每项修改建议,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,无法提交你的修改建议。请在几分钟后<a>重试</a>。感谢你花时间帮助我们改善 Unity 文档质量。

关闭

取消

声明

public static AssetBundle LoadFromStream(Stream stream);

声明

public static AssetBundle LoadFromStream(Stream stream, uint crc);

声明

public static AssetBundle LoadFromStream(Stream stream, uint crc, uint managedReadBufferSize);

参数

stream 托管的 Stream 对象。Unity 调用此对象上的 Read()、Seek() 和 Length 属性加载 AssetBundle 数据。
crc 未压缩内容的可选 CRC-32 校验和。
managedReadBufferSize 你可以用它来覆盖 Unity 在加载数据时使用的读缓冲区大小。默认大小为 32KB。

返回值

AssetBundle 加载的 AssetBundle 对象或对象加载失败时返回 null。

说明

同步从托管的 Stream 加载一个 AssetBundle。

此函数支持任何压缩类型的包。lzma 压缩数据会解压到内存中,而未压缩和块压缩包直接从 Stream 读取。

当校验和不为零时,在加载内容之前,将基于校验和对内容进行对比。如果不匹配,则会引发一个错误。

LoadFromStreamAsync 不同,此函数是同步的,仅在加载 AssetBundle 对象后才会返回。

LoadFromFile 不同,AssetBundle 的数据是由托管的 Stream 对象提供的。

以下是对 Stream 对象的限制,以优化 AssetBundle 数据加载

  1. AssetBundle 数据必须从流位置零开始。
  2. Unity 在加载 AssetBundle 数据之前,将寻址位置设为零。
  3. Unity 假设流中的读取位置不会因任何其他进程而变化。这样允许 Unity 进程在每次读取之前不必调用 Seek() 就可从流中进行读取。
  4. stream.CanRead 必须返回 true。
  5. stream.CanSeek 必须返回 true。
  6. 它必须需要对与主线程不同的线程进行访问。Seek() 和 Read() 可从任何 Unity 本机线程调用。
  7. 在某些情况下,Unity 会尝试读取超出 AssetBundle 数据大小的数据。Stream 实现必须优雅地处理此问题,并且不抛出异常。Stream 实现还必须返回实际读取的字节数(不包括超出 AssetBundle 数据末尾的任何字节)。
  8. 当从 AssetBundle 数据末尾开始并尝试读取数据时,Stream 实现必须返回读取的字节数为 0,并且不抛出异常。

为了减少从本机代码到托管代码的调用次数,从 Stream 使用缓冲区大小为 managedReadBufferSize 的缓冲区读取数据。

  • 更改 managedReadBufferSize 可能会更改加载性能,尤其是在移动设备上。
  • managedReadBufferSize 的最佳值因项目而异,甚至可能因 Asset Bundle 而异。
  • 值得尝试的一些好值范围为:8KB、16KB、32KB、64KB、128KB。
  • 对于压缩的 Asset Bundle 或如果 Asset Bundle 包含很多大尺寸的资产,抑或是 Asset Bundle 中不包含很多资产且从 Asset Bundle 中按顺序加载这些资产,则较大的值可能更合适。
  • 对于未压缩的 Asset Bundle 和读取大量小资产,或如果 Asset Bundle 中包含大量资产且按随机顺序加载这些资产,则较小的值可能更合适。

在加载 AssetBundle 或 bundle 中的任何资产时,请勿释放 Stream 对象。其生命周期应长于 AssetBundle 的生命周期。这意味着在调用 AssetBundle.Unload 之后释放 Stream 对象。

using UnityEngine;
using System.Collections;
using System;
using System.IO;

public class LoadFromStreamExample : MonoBehaviour { void Start() { var fileStream = new FileStream(Application.streamingAssetsPath, FileMode.Open, FileAccess.Read); var myLoadedAssetBundle = AssetBundle.LoadFromStream(fileStream); if (myLoadedAssetBundle == null) { Debug.Log("Failed to load AssetBundle!"); return; }

var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject"); Instantiate(prefab);

myLoadedAssetBundle.Unload(false); fileStream.Dispose(); } }