【Unity开发】Unity实现glb模型上传到场景中使用功能
一、效果展示
点击按钮上传glb格式的模型,进行后续移动、旋转和缩放操作,上传的模型会出现在原点(0,0,0)位置
演示视频:
Unity实现glb模型上传到场景中使用功能
二、环境要求
需要下载安装用于加载glb模型的插件,下载好后直接拖入项目中进行使用
下载链接:https://github.com/Siccity/GLTFUtility/releases
三、实现完整代码
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.IO;
using System.Windows.Forms;
using Button = UnityEngine.UI.Button;
#if UNITY_EDITOR
using UnityEditor;
#endif
using Siccity.GLTFUtility;public class UploadModel : MonoBehaviour
{public Transform modelParent; // 模型的父节点public Button uploadButton; // UI按钮,点击触发上传void Start(){uploadButton.onClick.AddListener(OnUploadButtonClicked);}void OnUploadButtonClicked(){//在unity编辑器中进行模型上传
#if UNITY_EDITORstring path = EditorUtility.OpenFilePanel("选择模型", "", "glb,gltf");if (!string.IsNullOrEmpty(path)){StartCoroutine(LoadModel(path));}//导出exe后进行模型上传
#elif UNITY_STANDALONE_WINstring path = OpenFileDialogWin("选择模型文件", "glb|*.glb|gltf|*.gltf");if (!string.IsNullOrEmpty(path)){StartCoroutine(LoadModel(path));}
#elseDebug.LogWarning("当前平台暂不支持文件选择功能!");
#endif}/// <summary>/// 模型加载方法/// </summary>/// <param name="path"></param>/// <returns></returns>IEnumerator LoadModel(string path){Debug.Log("加载模型: " + path);GameObject loadedModel = Importer.LoadFromFile(path);if (loadedModel != null){loadedModel.transform.SetParent(modelParent, false);loadedModel.transform.localPosition = Vector3.zero;loadedModel.transform.localRotation = Quaternion.identity;loadedModel.transform.localScale = Vector3.one;if (!loadedModel.GetComponent<Collider>()){// 加载成功后,添加 Collider组件loadedModel.AddComponent<BoxCollider>();// 添加控制模型移动、旋转和缩放的组件loadedModel.AddComponent<ModelControl>();}Debug.Log("模型加载成功!");}else{Debug.LogError("模型加载失败!");}yield return null;}/// <summary>/// 带出exe打开文件加载模型方法/// </summary>/// <param name="title"></param>/// <param name="filter"></param>/// <returns></returns>
#if UNITY_STANDALONE_WINstring OpenFileDialogWin(string title, string filter){OpenFileDialog ofd = new OpenFileDialog();ofd.Title = title;ofd.Filter = filter;ofd.Multiselect = false;DialogResult result = ofd.ShowDialog();if (result == DialogResult.OK){return ofd.FileName;}return null;}
#endif
}