Unity动态加载资源 - 从硬盘任意地址加载任意格式3D模型

这篇具有很好参考价值的文章主要介绍了Unity动态加载资源 - 从硬盘任意地址加载任意格式3D模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

一、Unity官方给的动态资源加载方式

二、Unity中调用windows资源管理器

三、从资源管理器获得文件地址后复制到Unity指定文件夹

附上全部代码(不完善,仅框架)


前言

Unity官方给的动态资源加载方式就不赘述了。大体分为3种:(1) Resources.Load (2)AssetBundle(3) WWW加载 。 其中前两种大多用在本地资源加载,第三种用在web端从服务器加载。前两种都只能从特定的文件夹下面加载资源,也就是Asset下面特定名字的几个文件夹。

项目需求:打开win资源浏览器,从任意目录打开一个任意格式3D模型,加载进Unity主界面上。


一、Unity官方给的动态资源加载方式

给几个关键的链接和教程(讲的都很详细),以及官方文档(完全没懂在讲啥),有需要的自取


Unity日常 - 资源加载与文件路径_51CTO博客_unity动态加载资源的方式
Unity AssetBundle 打包 四种加载方式 服务器加载_荷兰猪小灰灰的博客-CSDN博客
AssetBundle 工作流程 - Unity 手册

二、Unity中调用windows资源管理器

关键教程链接:

Unity对于window下的资源管理器的基本操作_unity 打开windows资源管理器_以梦为马,不负韶华的博客-CSDN博客

但是这个教程中的文件格式过滤器有问题,会导致在文件打开窗口右下角的“类型选择”下拉表出现乱码以及过滤不正确等问题,具体格式应该如下:

_ofn.filter = "模型文件(*.obj)\0*.obj;"
            + "\0模型文件(*.stl)\0*.stl;"
            + "\0所有支持文件(*.obj *.stl)\0*.obj;*.stl\0";

说一下格式规则:
1、 \0*.obj 中间不能有间隔。
2、说明文字模型文件(*.obj)和给系统看的 “ *.obj”一定要用 “\0” 隔开。
3、不同的类型之间用“;” 隔开。

三、从资源管理器获得文件地址后复制到Unity指定文件夹

unity 载入stl,unity,游戏引擎,c#
这里建立了一个缓存文件夹“ModelsBuffer”具体代码如下: 

 // 如果读取成功,转成OBJ先放入缓存文件夹:Resources/ModelsBuffer;
        bool judge_FileBuffer = false;
        if (LocalDialog.GetOpenFileName(_ofn)){
            String path_Buffer = Application.dataPath + "/Resources/ModelsBuffer/";
            bool judge_Path = false;
            if (!Directory.Exists(path_Buffer)){
                Directory.CreateDirectory(path_Buffer);
                judge_Path = true;
            }
            else {
                judge_Path = true;
            }

            if (_ofn.fileFull.Length != 0 && judge_Path) { 
                String dir_FilenameFull = path_Buffer + _ofn.fileTitle;
                System.IO.File.Copy(_ofn.fileFull, dir_FilenameFull, true);
                AssetDatabase.Refresh();
                judge_FileBuffer = true;
            }
            else{
                Debug.Log("文件路径为空或存在不支持的语言符号种类");
            }
        }

 

切记Copy完文件一定要做一次AssetDatabase.Refresh(),刷新Unity的资产包,这样Unity才能在Resources/ModelsBuffer文件夹下正确获取文件。

然后再从缓存下加载,具体代码如下:文章来源地址https://www.toymoban.com/news/detail-762047.html

  // 从缓存文件夹下加载模型;
if (judge_FileBuffer){
    String _tempFN = _ofn.fileTitle.Substring(0, _ofn.fileTitle.Length - 4);
    var _obj = Resources.Load<GameObject>("ModelsBuffer/" + _tempFN);
    if (_obj){
        var _objInstant = Instantiate(_obj);
         _objInstant.transform.localScale = Vector3.one * 30;
         _objInstant.transform.localPosition = new Vector3(10f, -11.7f, 174.7f);
    }
}

附上全部代码(不完善,仅框架)


using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

using System;
using System.IO;
using System.Collections;
using System.Runtime.InteropServices;

using FileIO;


// ------------------------------------------------ 主程序运行类 ------------------------------------------------ //

public class LoadFiles_win10 : MonoBehaviour
{

    // ------------------------------------------------ 打开模型;

    // 3.单击后打开文件浏览器:
    public void Click_OpenFileDialog()
    {
        //Debug.Log("getIn Click_OpenFileDialog");

        FileNameStruct _ofn = new FileNameStruct();
        _ofn.structSize = Marshal.SizeOf(_ofn);
        _ofn.filter = "模型文件(*.obj)\0*.obj;"
                    + "\0模型文件(*.stl)\0*.stl;"
                    + "\0所有支持文件(*.obj *.stl)\0*.obj;*.stl\0";
        _ofn.fileFull = new string(new char[256]);
        _ofn.maxFile = _ofn.fileFull.Length;
        _ofn.fileTitle = new string(new char[64]);
        _ofn.maxFileTitle = _ofn.fileTitle.Length;
        _ofn.initialDir = Application.streamingAssetsPath.Replace('/', '\\');//默认路径
        _ofn.title = "载入模型文件";
        _ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000008;


        // 如果读取成功,转成OBJ先放入缓存文件夹:Resources/ModelsBuffer;
        bool judge_FileBuffer = false;
        if (LocalDialog.GetOpenFileName(_ofn)){
            String path_Buffer = Application.dataPath + "/Resources/ModelsBuffer/";
            bool judge_Path = false;
            if (!Directory.Exists(path_Buffer)){
                Directory.CreateDirectory(path_Buffer);
                judge_Path = true;
            }
            else {
                judge_Path = true;
            }

            if (_ofn.fileFull.Length != 0 && judge_Path) { 
                String dir_FilenameFull = path_Buffer + _ofn.fileTitle;
                System.IO.File.Copy(_ofn.fileFull, dir_FilenameFull, true);
                AssetDatabase.Refresh();
                judge_FileBuffer = true;
            }
            else{
                Debug.Log("文件路径为空或存在不支持的语言符号种类");
            }
        }

        // 从缓存文件夹下加载模型;
        if (judge_FileBuffer){
            String _tempFN = _ofn.fileTitle.Substring(0, _ofn.fileTitle.Length - 4);
            var _obj = Resources.Load<GameObject>("ModelsBuffer/" + _tempFN);
            if (_obj){
                var _objInstant = Instantiate(_obj);
                _objInstant.transform.localScale = Vector3.one * 30;
                _objInstant.transform.localPosition = new Vector3(10f, -11.7f, 174.7f);
            }
        }

        // 模型文件读取后转入数据库;
        if (judge_FileBuffer) {
            bool judge_Read = false;
            FileIO_OBJ _io = new FileIO_OBJ();
            judge_Read = _io.read_OBJ(_ofn.fileFull);
        }


    }

    // ------------------------------------------------ 保存模型;
    public void Click_SaveFileDialog()
    {
        Debug.Log("getIn Click_SaveFileDialog");

        FileNameStruct _sfn = new FileNameStruct();

        if (LocalDialog.GetSaveFileName(_sfn))
        {
           
        }
    }


}




// ------------------------------------------- win10 文件浏览器调用类 ------------------------------------------- //

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]

//1.OpenFileName数据接收类:
public class FileNameStruct
{
    public int structSize = 0;
    public IntPtr dlgOwner = IntPtr.Zero;
    public IntPtr instance = IntPtr.Zero;
    public String filter = null;
    public String customFilter = null;
    public int maxCustFilter = 0;
    public int filterIndex = 0;
    public String fileFull = null;
    public int maxFile = 0;
    public String fileTitle = null;
    public int maxFileTitle = 0;
    public String initialDir = null;
    public String title = null;
    public int flags = 0;
    public short fileOffset = 0;
    public short fileExtension = 0;
    public String defExt = null;
    public IntPtr custData = IntPtr.Zero;
    public IntPtr hook = IntPtr.Zero;
    public String templateName = null;
    public IntPtr reservedPtr = IntPtr.Zero;
    public int reservedInt = 0;
    public int flagsEx = 0;
}

//2.系统函数调用类:
public class LocalDialog
{
    //链接指定系统函数       打开文件对话框
    [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool GetOpenFileName([In, Out] FileNameStruct ofn);
    public static bool GetOFN([In, Out] FileNameStruct ofn) { return GetOpenFileName(ofn); }
    //链接指定系统函数        另存为对话框
    [DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
    public static extern bool GetSaveFileName([In, Out] FileNameStruct ofn);
    public static bool GetSFN([In, Out] FileNameStruct ofn) { return GetSaveFileName(ofn); }
}

到了这里,关于Unity动态加载资源 - 从硬盘任意地址加载任意格式3D模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IOS使用Unity容器动态加载3D模型

    项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。 对于Unity容器来说,需要满足如下的功能: 1.在APP启动时,需要满足动态下载

    2024年03月18日
    浏览(42)
  • Unity3D中Resources动态加载图片

    问题:unity的Resources动态加载就不必多说了,这里出现的问题是当我把图片放入Resources文件夹后,使用Resources.Load(datapath)却并没有出现图片。 分析:由于你放在文件夹下的是图片,是Texture2D类型,但是实际用在u3d中的是sprite,所以需要转换类型。 方式: 1.在代码中先行创

    2024年02月11日
    浏览(42)
  • Python爬取东方财富网任意股票任意时间段的Ajax动态加载股票数据

    最近由于需求想爬取以下东方财富网的股票数据,但是发现没有想象那么简单,接下来我会讲述一下我遇到的问题以及是如何解决,最后成功的爬出了想要的数据。 首先我们F12打开东方财富网网页源码,以指南针(300803)为例: 我们先点击 网络 ,再点击 300803.html ,再选择右边

    2024年02月06日
    浏览(45)
  • Surface实现TF卡槽引导Ventoy加载Fydeos,不格式化硬盘,不重装Windows!

    最近买了一台Suface Pro 3,装的是Win 10系统,4+64GB版本。 但因为Windows的触屏体验不是特别好, 所以想装一个Windows+Android系统来满足一下日常学习+娱乐。 在市面上找到一个Fydeos系统,可以运行安卓APP,并且fydeos团队对Surface全系列都做了对应版本,所以驱动适配会很好,于是就

    2024年02月08日
    浏览(121)
  • Unity 场景加载和资源加载

    一个游戏往往都是由很多场景组成的,例如会有主界面场景、战斗场景…等,不同的场景也是由若干的资源组合而成,在游戏的制作过程中,场景和资源的加载是不可或缺的。不管是场景还是资源都会涉及到加载的问题,在什么时候进行场景或资源的加载?场景的加载和资源

    2024年02月04日
    浏览(39)
  • Unity使用 Addressables 预加载所有资源,提现加载资源,发布webgl加载缓慢问题

    Addressables 我也是刚接触,知道的不是很多,基本的用法还是知道一些的 1 .在Window–Package Manager里找到Addressables进行安装   2.选择资源,点击Assets中的一个资源,在Inspector面板上就会出现一个勾选Assressable,也就是是否加入资源打包的分组,和AssetBundle分组是一个性质。选上以

    2023年04月08日
    浏览(46)
  • Unity3D 进行任意角度调节视角

    有很多小伙伴一定在初学Unity3D时遇到不小心将窗口视角打乱的情形, 例如不小心点击右上角的XYZ轴导致视角不同, 图1: 图2 如何恢复至初始角度呢?比较纠结。其实不用恢复至初始角度,你点击的那个坐标按钮,表示你想从不同的角度去看这个terrain(地形),所以可以按

    2024年02月11日
    浏览(43)
  • UE5 动态加载资源和类

    因为是动态加载,所以不用在构造的时候去加载。这里再BeginPlay里加载。 加载StaticMesh等资源,就使用LoadObjectUStaticMesh(nullptr,TEXT(\\\"Copy Reference\\\")) 加载类资源,比如蓝图Actor类 就使用LoadClassAActor(this,TEXT(\\\"Copy Reference\\\")) 但是同样要在最后一个字母后+_C  TEXT(\\\"/Script/Engine.Blueprint\\\'/Ga

    2024年02月21日
    浏览(45)
  • Unity资源加载方式

    Resources:逻辑资源目录,这个目录中的资源会 打入到包 中, 不允许热更 。在打包时会被压缩和加密。 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口 StreamingAssets:Raw资源目录,这个目录中的资源也会 打入到包 中,且允许程序通过Application.streamingAsse

    2023年04月09日
    浏览(37)
  • Unity中资源异步加载

            Unity作为一款优秀的游戏引擎,广泛应用于游戏制作领域。在游戏的开发过程中,资源加载的效率和流畅度尤为重要。对于较大的资源文件,同步加载方式可能会导致游戏卡顿、延迟等问题。因此,采用异步加载的方法可以提高游戏的效率和用户体验。 本篇博客将

    2024年02月06日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包