TriLib2:Unity运行时运行时加载模型

概述

本文基于此版本

TriLib 2 是 Unity 的一款强大的 3D 模型运行时导入工具包,可以在游戏运行期间或编辑器中动态加载多种格式的模型,笔者也只是简单使用了从文件路径加载模型一种用法,旨在帮助你快速入门.

它支持的格式包括 FBX、OBJ、GLTF2、STL、PLY、3MF、DAE 和 ZIP 等,适用于多个平台,如 Windows、Mac、Linux、UWP、Android、iOS 和 WebGL。

主要功能:

动态模型导入:

支持从本地文件系统、网络 URL 或自定义数据源加载模型,无需依赖本地插件(完全用 C# 编写)。

开发者可以使用 AssetLoaderOptions 对加载过程进行详细配置。

材质、纹理和动画导入:

除了模型的几何信息外,还支持材质和纹理的自动映射,并能导入模型的动画。

跨平台支持:

能在多种平台上运行,包括桌面系统、移动设备和 WebGL。

自定义进度管理与回调:

TriLib 提供了一系列事件回调接口,例如在加载开始、加载进度更新、错误发生和加载完成时触发特定操作。

示例

官方示例

这是加载某个目录地址下的.obj模型示例,路径如下

核心方法

最核心的实际上就是这个方法来帮助我们加载来自文件的模型

其他的都是为了给该方法补齐参数的:如文件路径,加载选项(_assetLoaderOptions)

这里使用AssetLoader.CreateDefaultLoaderOptions创建默认的加载选项.

该方法的是异步加载,所以为我们提供了回调.

我主要介绍几个回调方法:

OnLoad:

当这个回调被执行的时候网格已经加载完了,这里回调提供我们一个加载上下文对象,

在这里我们才可以访问,这里这个对象的RootGameObject对象,就是我们想要的加载出来的对象.

注意是才,因为假设你的模型较大,如果你不是在这个回调中操作了这个对象,而是在其他位置(

AssetLoader.LoadModelFromFile会直接返回上下文对象,即便没加载完),且先于这个回调完成之前,那就会得到空引用异常.

OnMaterialsLoad:

这个显然是在Onload之后执行的一个回调,这里代表材质也被加载完毕了,整个加载过程完全结束,你可以安全的访问这个上下文中的模型对象,所以我建议在这里对模型对象进行处理.

加载过程结束并不需要你克隆,而是直接产生一个物体.

OnError:

发生加载错误的时候在这里处理,例如路径没有对应的模型

OnProgress:

这个回调在加载过程中会被不停地调用,传给你一个加载进度progress

progress加载完毕的时候会传递多次1.

全部代码

cs 复制代码
#pragma warning disable 649
using TriLibCore.General;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

namespace TriLibCore.Samples
{
    /// <summary>
    /// Represents a sample that loads the "TriLibSample.obj" Model from the "Models" folder.
    /// </summary>
    public class LoadModelFromFileSample : MonoBehaviour
    {
        /// <summary>
        /// Returns the path to the "TriLibSample.obj" Model.
        /// </summary>
        private string ModelPath
        {
            get
            {
#if UNITY_EDITOR
                return $"{Application.dataPath}/TriLib/TriLibSamples/LoadModelFromFile/Models/TriLibSampleModel.obj";
#else
                return "Models/TriLibSampleModel.obj";
#endif
            }
        }

        /// <summary>
        /// Cached Asset Loader Options instance.
        /// </summary>
        private AssetLoaderOptions _assetLoaderOptions;

        AssetLoaderContext _assetLoaderContext;

        /// <summary>
        /// Loads the "Models/TriLibSample.obj" Model using the given AssetLoaderOptions.
        /// </summary>
        /// <remarks>
        /// You can create the AssetLoaderOptions by right clicking on the Assets Explorer and selecting "TriLib->Create->AssetLoaderOptions->Pre-Built AssetLoaderOptions".
        /// </remarks>
        private void Start()
        {
            if (_assetLoaderOptions == null)
            {
                _assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions(false, true);
            }

            _assetLoaderContext = AssetLoader.LoadModelFromFile(ModelPath, OnLoad, OnMaterialsLoad, OnProgress, OnError,
                null, _assetLoaderOptions);
          
        }
        

        /// <summary>
        /// Called when any error occurs.
        /// </summary>
        /// <param name="obj">The contextualized error, containing the original exception and the context passed to the method where the error was thrown.</param>
        private void OnError(IContextualizedError obj)
        {
            Debug.LogError($"An error occurred while loading your Model: {obj.GetInnerException()}");
        }

        /// <summary>
        /// Called when the Model loading progress changes.
        /// </summary>
        /// <param name="assetLoaderContext">The context used to load the Model.</param>
        /// <param name="progress">The loading progress.</param>
        private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)
        {
            Debug.Log($"Loading Model. Progress: {progress:P}");
           
        }

        /// <summary>
        /// Called when the Model (including Textures and Materials) has been fully loaded.
        /// </summary>
        /// <remarks>The loaded GameObject is available on the assetLoaderContext.RootGameObject field.</remarks>
        /// <param name="assetLoaderContext">The context used to load the Model.</param>
        private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)
        {
            Debug.Log("Materials loaded. Model fully loaded.");
        }

        /// <summary>
        /// Called when the Model Meshes and hierarchy are loaded.
        /// </summary>
        /// <remarks>The loaded GameObject is available on the assetLoaderContext.RootGameObject field.</remarks>
        /// <param name="assetLoaderContext">The context used to load the Model.</param>
        private void OnLoad(AssetLoaderContext assetLoaderContext)
        {
            Debug.Log("网格加载完毕");
        }
    }
}
相关推荐
学习!!!1 小时前
游戏引擎中的颜色科学
游戏引擎
这不比博人传燃?1 小时前
传奇996_3——使用补丁添加怪物
游戏引擎
一杯杰曦卡4 小时前
Unity 使用Netcode实现用户登录和登出
unity·游戏引擎
tealcwu14 小时前
【Unity基础】Unity中的UI系统
ui·unity·lucene
北冥没有鱼啊16 小时前
UE5 射线折射
游戏·ue5·游戏引擎·ue4
※※冰馨※※17 小时前
Unity3D 鼠标移动到按钮上显示信息
开发语言·unity·c#
云围20 小时前
Gitlab 官方推荐自动化cache服务器Minio的安装
git·unity·ci/cd·自动化·gitlab·devops
魔法自动机1 天前
Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动
unity·1024程序员节·fps
tealcwu1 天前
【Unity基础】初识UI Toolkit - 运行时UI
ui·unity·编辑器·游戏引擎
我们一起学前端1 天前
利用游戏引擎的优势
游戏引擎