/// <summary>
/// 加载GLB/GLTF模型
/// </summary>
public class LoadGLB_GLTFUtility :MonoBehaviour
{Action action;public GameObject ObjOfImport;bool isCreate = true;private static LoadGLB_GLTFUtility instance;public static LoadGLB_GLTFUtility Instance{get{if (instance == null){GameObject obj = new GameObject();obj.name = "LoadGLBUtility";instance = obj.AddComponent<LoadGLB_GLTFUtility>();}return instance;}}/// <summary>/// 导入网络glb资源/// </summary>/// <param name="url">模型路径</param>/// <param name="action">导入完成事件</param>public void ImportGLB_GLTFAsyncByWed(string url, Action action){StartCoroutine(DownLoadFile(url, action));}/// <summary>/// 导入网络glb资源/// </summary>/// <param name="url">路径</param>public void ImportGLBAsyncByWed(string url){StartCoroutine(DownLoadFile(url, null));}/// <summary>/// 下载网络资源到本地/// </summary>/// <param name="url"></param>/// <returns></returns>IEnumerator DownLoadFile(string url,Action action){yield return new WaitForSeconds(0.5f);string directoryPath = Application.persistentDataPath + "/FileCache";if (!Directory.Exists(directoryPath)){Directory.CreateDirectory(directoryPath);}string downloadFileName = url.Substring(url.LastIndexOf('/') + 1);string localpath = directoryPath + "/" + downloadFileName;Debug.Log(downloadFileName);//如果本地文件已存在 直接加载if (File.Exists(localpath)){ImportGLB_GLTFAsync(localpath, action);yield break;}UnityWebRequest webRequest = UnityWebRequest.Get(url);webRequest.timeout = 60;yield return webRequest.SendWebRequest();if (webRequest.isNetworkError){Debug.Log("Download Error: " + webRequest.error);if (File.Exists(localpath)){File.Delete(localpath);}}else{var file = webRequest.downloadHandler.data;FileStream nFile = new FileStream(localpath, FileMode.Create);nFile.Write(file, 0, file.Length);nFile.Close();ImportGLB_GLTFAsync(localpath, action);}}/// <summary>/// 异步加载 gltf and glb/// </summary>/// <param name="filepath">路径</param>/// <param name="action">回调函数</param>public void ImportGLB_GLTFAsync(string filepath, Action action){if (!isCreate) return;isCreate = false;UnloadAndDestroy(ObjOfImport);Importer.LoadFromFileAsync(filepath, new ImportSettings(), OnFinishAsync);this.action = action;}/// <summary>///异步加载模型/// </summary>/// <param name="filepath"><路径/param>public void ImportGLB_GLTFAsync(string filepath){if (!isCreate) return;isCreate = false;UnloadAndDestroy(ObjOfImport);Importer.LoadFromFileAsync(filepath, new ImportSettings(), OnFinishAsync);}/// <summary>/// 完成加载/// </summary>/// <param name="result">加载出来的物体</param>/// <param name="clip">加载的动画</param>/// <param name="transform"></param>/// <param name="name"></param>void OnFinishAsync(GameObject result, AnimationClip[] clip, Transform loadpos, string sign){ObjOfImport = result;isCreate = true;Debug.Log("Finished importing " + result.name);if (action != null)action();}/// <summary>/// 删除卸载 所有加载过的模型 清除缓存/// </summary>/// <param name="obj"></param>public void UnloadAndDestroy(GameObject obj){if (obj != null){GameObject.Destroy(obj);}Resources.UnloadUnusedAssets();}}
详细解决方案
Unity3D 动态加载本地/网络GLB模型
热度:16 发布时间:2023-09-21 22:15:23.0
相关解决方案
- 怎么用 svn 管理 unity3d 项目
- Unity3d Webplayer 障蔽缓存机制
- Unity3d 鼠标捡取 javascript
- unity3d ios开发 调试的流程?该怎么处理
- unity3d ios开发 调试的流程?解决思路
- (转)unity3D iPhone开发有关问题汇总
- Unity3D 搬动平台实现一种大规模(其实跟PC比还是算小规模)动画角色渲染的方案-绝对原创方案。
- Unity3d 播发高质量视频解决方案
- Unity3D 怎么在安卓手机上播放视频
- Android Unity3d 腾挪脚本
- unity3D C#容易代理使用了解
- Delegates, Events and Singletons with Unity3D – C
- UNITY3D c#脚本中处置类与结构体的区别
- Unity3D Android文件浏览器
- Unity3D Shader 入门第一天
- Unity3D 动态加载本地/网络GLB模型
- Unity3D 使用一个AudioSource同时播放背景音乐和按键音效
- Unity3D 如何干净的解除父子关系
- [Unity3D]什么是Apply Root Motion?什么是Bake into Pose?
- Unity3d 中 PlayerPrefs 保存数据的总结
- Unity3D 调用其他函数方法的三种方式
- Unity3D 第一人称相机旋转限制技巧
- Unity3d 的 EditorUtility类的简单说明
- Unity3D 文字线条效果
- Unity3D: 动态加载Prefab
- unity3d VR___________通过移动和旋转父物体,来使子物体始终在指定的位置上并且保持指定的角度
- [学习笔记] Unity3D 某些常用类
- [学习笔记]Unity3D 5 引擎------关节(Joint)
- 【转】Unity3d 赛车车辆各类性能算法
- Unity3d 连接MySQL数据库测试成功