Unity的WebGL平台动态加载glb/gltf测试

该博客展示了如何在Unity中使用GLTFUtility库从URL加载GLTF模型。作者提供了测试模型和WebGL演示,主要代码涉及UnityWebRequest发送请求获取模型数据,并使用GLTFUtility导入器加载模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用的是GLTFUtility GitHub - Siccity/GLTFUtility: Simple GLTF importer for Unity
gltf样品库 GitHub - KhronosGroup/glTF-Sample-Models: glTF Sample Models
我的测试模型 https://www.xuefei.net.cn/unitywebgl/WaterBottle.glb
我的webgl测试地址 Unity WebGL Player | GLTFUtility
主要代码

using System.Collections;
using UnityEngine;
using Siccity.GLTFUtility;
using UnityEngine.UI;
using UnityEngine.Networking;

public class GLTFTest : MonoBehaviour
{
    public Button button;
    public GameObject loadGo = null;

    // Start is called before the first frame update
    void Start()
    {
        button.onClick.AddListener(delegate
        {
            StartCoroutine(LoadGo());
        });
    }

    private IEnumerator LoadGo()
    {
        if (loadGo != null)
        {
            DestroyImmediate(loadGo);
            Resources.UnloadUnusedAssets();
        }
        var request = UnityWebRequest.Get("https://www.xuefei.net.cn/unitywebgl/WaterBottle.glb");
        yield return request.SendWebRequest();
        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError(request.error);
        }
        else
        {
            Debug.Log(request.downloadHandler.text);
            loadGo = Importer.LoadFromBytes(request.downloadHandler.data);
        }
    }
}

Siccity/GLTFUtility: Simple GLTF importer for Unity 停在了21年,看样子是嘎了,建议转向 KhronosGroup/UnityGLTF: Runtime glTF 2.0 Loader for Unity3D

https://www.xuefei.net.cn/UnityGLTF/

https://gitee.com/awnuxcvbn/GLTFUtility

运行报错未解决

UnityGLTF.framework.js:3Error loading file: WaterBottle.glb Message: UnityGLTF/PBRGraph not found. Did you forget to add it to the build? For more information, see:https://github.com/KhronosGroup/UnityGLTF?tab=readme-ov-file#ensure-shaders-are-available-in-your-build StackTrace: at UnityGLTF.BaseGraphMap..ctor (System.String shaderName, System.String fallbackGuid) [0x00000] in ……

### Unity WebGL 异步加载 GLB 模型的解决方案 在 Unity 中,WebGL 平台支持通过异步方式加载 GLBglTF Binary)模型。为了实现这一目标,可以使用 Unity 的 `UnityWebRequest` 或 `AssetBundle` 系统来加载外部资源[^1]。以下是具体的实现方法: #### 1. 使用 `UnityWebRequest` 加载 GLB 模型 `UnityWebRequest` 是一种强大的工具,用于从服务器或本地文件系统中下载数据。以下是一个示例代码,展示如何通过 `UnityWebRequest` 异步加载 GLB 文件并将其转换为游戏对象。 ```csharp using UnityEngine; using UnityEngine.Networking; public class LoadGLBModel : MonoBehaviour { public string glbUrl = "https://example.com/path/to/model.glb"; // 替换为你的GLB文件URL void Start() { StartCoroutine(LoadModelAsync()); } IEnumerator LoadModelAsync() { using (UnityWebRequest www = UnityWebRequestMultimedia.GetRawData(glbUrl)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.LogError("Failed to load GLB model: " + www.error); } else { byte[] glbData = www.downloadHandler.data; // 将字节数组转换为GameObject GameObject loadedModel = LoadGLBFromBytes(glbData); if (loadedModel != null) { loadedModel.transform.position = Vector3.zero; loadedModel.name = "LoadedGLBModel"; } } } } GameObject LoadGLBFromBytes(byte[] bytes) { // 这里需要一个第三方库(如gltf-unity-importer)来解析GLB数据 // 假设我们有一个函数可以完成此操作 return GltfUtility.ImportGLB(bytes); // 示例函数名 } } ``` 注意:Unity 本身并不直接支持 GLB 文件的解析,因此需要借助第三方插件或库,例如 [gltf-unity-importer](https://github.com/atteneder/gltf-unity-importer)[^2] 来解析 GLB 数据。 --- #### 2. 使用 `AssetBundle` 加载 GLB 模型 另一种方法是将 GLB 模型打包为 `AssetBundle`,然后在运行时加载该 `AssetBundle`。这种方法的优点是性能更高,且可以利用 Unity 的资源管理功能。 步骤如下: 1. 在 Unity 编辑器中,将 GLB 文件导入项目。 2. 创建一个包含 GLB 文件的 `AssetBundle`。 3. 在运行时通过 `AssetBundle.LoadFromFileAsync` 或 `AssetBundleManifest` 下载并加载 `AssetBundle`。 示例代码: ```csharp using UnityEngine; using UnityEngine.Networking; public class LoadGLBFromAssetBundle : MonoBehaviour { public string assetBundleUrl = "https://example.com/path/to/bundle.unity3d"; // 替换为你的AssetBundle URL void Start() { StartCoroutine(LoadAssetBundleAsync()); } IEnumerator LoadAssetBundleAsync() { using (UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(assetBundleUrl)) { yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.LogError("Failed to load AssetBundle: " + www.error); } else { AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www); GameObject loadedModel = bundle.LoadAsset<GameObject>("ModelName"); // 替换为实际模型名称 if (loadedModel != null) { Instantiate(loadedModel, Vector3.zero, Quaternion.identity); } } } } } ``` --- #### 3. 注意事项 - 在 WebGL 平台上,确保所有资源都已正确打包,并可通过 HTTP 或 HTTPS 访问[^1]。 - 如果使用第三方库解析 GLB 文件,请确保该库支持 WebGL 平台。 - 考虑到 WebGL 的内存限制,尽量优化模型大小和纹理分辨率[^1]。 ---
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地狱为王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值