加载服务端发送的模型文件_unity开发进阶

news2024/11/17 23:55:06

加载服务端发送的模型文件

  • 前言
  • 一、服务端搭建
  • 二、unity请求文件
  • 三、加载模型
  • 结语

前言

之前我们学习制作的都是离线状态下的东西,今天我们学习制作一个小demo。
内容就是我们用unity请求后台,接受后台发送过来的模型,然后将模型加载到场景中的指定位置上。

一、服务端搭建

既然有请求,那么就得有个服务端,这里我们先用node.js简易的搭建一个可以发送文件的服务,这里不要求很精良,能发送文件用来演示即可。用java、python后端搭建服务也是可以的。

🟠没有安装node的话直接去官网下载,下载完成之后一路傻瓜式安装即可,甚至环境在安装的时候都自动配好了。还是建议去网上搜一下教程,根据教程安装。

🟠node官网: https://nodejs.org/en

安装完成之后在控制台输入node -v出现版本号就表示安装好了,这里我的版本比较老旧,大家可以下载最新20的版本。
在这里插入图片描述

下面直接上node代码:

const http = require('http')
const fs = require('fs');
const server = http.createServer()

server.on('request',(req, res)=>{
    console.log(req.url,req.method);
    const filePath = './data/水车.FBX'; // 传输的文件路径

    fs.readFile(filePath, (err, data) => {
      if (err) {
        res.statusCode = 500;
        res.end('Error reading file');
      } else {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/octet-stream'); // 设置响应头,通知客户端下载文件
        const encodedFileName = encodeURIComponent('水车.FBX');
        res.setHeader('Content-Disposition', 'attachment; filename=' + encodedFileName);
        
        res.end(data);
      }
    });
})

server.listen(2000,()=>{
    //服务开启之后的回调函数
    console.log('服务已启动');
})

node代码编辑完成之后,在控制台输入node .\文件名.js然后回车,这里注意路径。
在这里插入图片描述
当出现服务已启动字样之后就可以了,然后可以在网页的地址栏输入http://127.0.0.1:2000/,然后回车,看是否有文件进行下载,如果有文件进行下载,那就没问题了,可以进行下一步了。

🟠这里的模型文件我用的是.fbx格式的文件,模型的文件大家可以去网上自行下载。

二、unity请求文件

服务端有了之后,我们需要在unity上编写脚本进行请求。在资源窗口创建一个Script文件夹,然后创建一个脚本文件http。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using System.IO;
using UnityEditor;

public class http : MonoBehaviour
{
    public void Getxxxx()
    {
    	// 启动协程,协程可以简单理解为等待某个事物完成之后再执行,类似vue中的异步async、await
    	// 具体可以查看阅读我的相关文章
        StartCoroutine(GetRequest("http://127.0.0.1:2000/"));
    }

	//协程方式请求函数
    IEnumerator GetRequest(string uri)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
        {
            // Request and wait for the desired page.
            yield return webRequest.SendWebRequest();

            //Debug.Log(webRequest.SendWebRequest());

            string[] pages = uri.Split('/');
            int page = pages.Length - 1;

            switch (webRequest.result)
            {
                case UnityWebRequest.Result.ConnectionError:
                case UnityWebRequest.Result.DataProcessingError:
                    Debug.LogError(pages[page] + ": Error: " + webRequest.error);
                    break;
                case UnityWebRequest.Result.ProtocolError:
                    Debug.LogError(pages[page] + ": HTTP Error: " + webRequest.error);
                    break;
                case UnityWebRequest.Result.Success:
                    // 保存文件到资源文件夹
                    string savePath = Path.Combine(Application.dataPath, "Fbx/水车.FBX");
                    File.WriteAllBytes(savePath, webRequest.downloadHandler.data);
                    //刷新资源文件
                    AssetDatabase.Refresh();
                    Debug.Log("文件加载完成");
                    // 在资源文件夹中使用文件
                    string modelPath = "Assets/Fbx/水车.fbx";
                    GameObject loadedPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(modelPath);
                    if (loadedPrefab != null)
                    {
                        Vector3 position = new Vector3(0f, 0f, 0f); // 指定模型的位置
                        Quaternion rotation = Quaternion.identity; // 指定模型的旋转

                        GameObject instance = Instantiate(loadedPrefab, position, rotation);
                        
                    }
                    else
                    {
                        Debug.Log("无法加载模型");
                    }
                    break;
            }
        }
    }

}

在脚本挂载之前先创建一个UI,就只有一个button,创建过程就不再阐述了,直接看效果。
在这里插入图片描述

完成之后把脚本挂载到Canvas上,在子级的button中创建一个onClick()

  1. 先点击加号,在把Canvas挂载到对应位置。
    在这里插入图片描述
  2. 然后点击下拉框
    在这里插入图片描述
  3. 选择我们的http脚本,点击脚本中的Getxxxx()方法
    在这里插入图片描述
  4. 这样就完成了,然后运行试验即可。
    在这里插入图片描述
    最后还要创建一个Fbx的文件夹,用来保存服务端传过来的模型文件。
    在这里插入图片描述

三、加载模型

  1. 运行之前记得先开启node服务。
    在这里插入图片描述

  2. 然后点击运行
    在这里插入图片描述

  3. 点击加载模型按钮
    在这里插入图片描述

  4. 就可以看到,后台传过来的模型已经被我们接受并且加载到场景中了。
    在这里插入图片描述
    同时Fbx文件也保存了模型文件
    在这里插入图片描述

结语

demo的逻辑其实跟简单,大致可以分为:向服务端请求模型文件、保存模型、加载模型。

文章到这里就讲完了,哪里有没讲解清楚的,可以评论区或者私聊告诉我。下期见,拜拜!

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试题-【消息队列】

消息队列 问题1 如何进行消息队列的技术选型优点解耦 &#xff08;pub/sub模型&#xff09;异步&#xff08;异步接口性能优化&#xff09;削峰 使用消息队列的缺点几种消息队列的特性 问题2 引入消息队列之后该如何保证其高可用性RabbitMQ的高可用kafka高可用 问题3 在消息队列…

使用MMYOLO中yolov8训练自己VOC数据集实战

概述 MMYOLO是商汤公司基于PyTorch框架和YOLO系列算法开源的工具箱 - 目前支持的任务 目标检测旋转框目标检测 - 支持的算法 YOLOv5YOLOv6YOLOv7YOLOv8YOLOXRTMDetRTMDet-Rotated - 支持的数据集 COCO Dataset VOC Dataset CrowdHuman Dataset DOTA 1.0 Dataset 安装…

SpringBoot集成mybatis时idea控制台中文乱码问题解决

在application.yml中配置好映射文件打印数据库日志文件时&#xff0c;控制台出现乱码的情况解决如下 问题 在执行查询操作的时候&#xff0c;查询时可以查看是没有问题的&#xff0c;但是控制台乱码了 解决 在File-Setting-Editor-File Encodings中设置如图所示就可以了 现在…

【Web前端实操15】利用Grid布局完成九宫格

相关知识点&#xff1a; 创建多列 column-count 属性指定了需要分割的列数 列与列之间的间隙 column-gap 属性指定了列与列间的间隙 列边框 column-rule-style 属性指定了列与列间的边框样式 column-rule-width 属性指定了两列的边框厚度 column-rule-color 属性指定了…

解读《鸿蒙·NEXT星空版》华为注资70亿,将每月开发岗增涨10万+

​1月18日&#xff0c;鸿蒙生态千帆启航仪式正式开启。华为余承东说道&#xff1a;鸿蒙生态大势已定&#xff0c;满天星光&#xff0c;终汇成璀璨星河。 HarmonyOS NEXT鸿蒙星河版面向开发者开放申请。星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联…

基于 Docker 搭建 Uptime-Kuma 一个极简风的应用监控

GitHub&#xff1a;https://github.com/louislam/uptime-kuma 一、uptime-kuma 介绍 Demo&#xff1a;https://uptime.wuhanjiayou.cn/ uptime-kuma 是一款开源的监控工具, 支持 TCP / PING / HTTP 等多种监控方式&#xff0c;可监测网站&#xff0c;数据库&#xff0c;Docker…

0125-2-Vue深入学习1—mustache模板引擎原理

[mustache] 是 “胡子”的意思&#xff0c;因为它的嵌入标记 {{ }} 旋转过来很像[胡子]&#xff0c;Vue中的 {{ }} 语法也引用了mustache&#xff0c;这也是我深入学习的目的。 1、原始js方式使 数据 变为视图 <ul id"list"></ul><script>var arr …

01-echarts如何绘制三维折线图

echarts如何绘制三维折线图 一、相关依赖包1、下载依赖2、引入依赖 二、创建图表盒子1、创建盒子2、定义数据3、编写方法1、初始化盒子2、设置配置项3、修改数据格式4、设置颜色数组4、设置name数组5、设置线三维和点三维6、添加配置项7、设置图表自适应 4、调用方法 三、整体代…

Oracle DG环境下的秘钥管理

今天有朋友问到1&#xff09;DG环境下的秘钥管理需要注意什么&#xff0c;2&#xff09;秘钥管理对DG的日志同步有影响吗&#xff1f; 对于2&#xff09;的回答是明确的&#xff0c;没有影响。秘钥的管理和DG的redo log shipping完全是两套机制。在最新版的Oracle Key Vault常…

线上版本升级 — — pg数据库备份

线上版本升级 — — pg数据库备份 在版本升级之前&#xff0c;我们通常为了保险都需要将数据库里的数据结构备份一份&#xff0c;防止升级失败之后数据丢失。&#xff08;根据业务而来&#xff0c;并非所有业务都需要备份&#xff09; 1 备份 1.1 pg_dump&#xff1a;备份指定…

Linux常见的管理命令

1. whoami 作用&#xff1a; 显示出当前有效的用户名称&#xff0c;Linux是多用户多任务 语法&#xff1a;whoami(选项) 选项&#xff1a; --help&#xff1a;在线帮助 --version&#xff1a;显示版本信息和退出 场景使用&#xff1a; 1. 当用户想要查看当前登录系统的用户…

04 约数

定义&#xff1a; 若整数n除以整数d的余数为0&#xff0c;即d能够整除n&#xff0c;n是d的倍数&#xff0c;记作d|n. 通过质因子求一个数的约数 如果n可以表示成 其中均为n的质因子 因为对于任意一个质因子都有选0个 选1个 选2个....选个共种可能&#xff0c; n的约数个数…

C++ STL库详解:list

目录 一、list简介 二、list的使用 2.1list的构造 2.2list iterator迭代器的使用 2.3list element access 2.4list 常见接口 2.5迭代器失效 三、list与vector的对比 一、list简介 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器…

腾讯云轻量应用服务器Docker如何一键搭建属于自己的幻兽帕鲁服务器?

幻兽帕鲁/Palworld是一款2024年Pocketpair开发的开放世界生存制作游戏&#xff0c;在帕鲁的世界&#xff0c;玩家可以选择与神奇的生物“帕鲁”一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。而帕鲁可以进行战斗、繁殖、协助玩家做农活&#xff0c;也…

【机器学习300问】19、深度学习和机器学习什么关系?

之前的文章都聚焦在传统的机器学习上&#xff0c;作为入门&#xff0c;学了许多机器学习的基础。往后的文章我会穿插着机器学习和深度学习的内容进行&#xff0c;所有有必要在这里先说下两者的关系。 一、从范围上讲 深度学习和机器学习都是人工智能的一个子领域&#xff0c;它…

杰理-修改蓝牙版本5.4

杰理-修改蓝牙版本5.4 #define BLUETOOTH_CORE_SPEC_54 0x0dextern void set_bt_version(u8 version); set_bt_version(BLUETOOTH_CORE_SPEC_54); //蓝牙版本5.4

Vscode配置python代码开发

文章目录 1. 配置python运行环境2. 常用插件说明3. Vscode配置文件说明3.1 setting.json配置说明3.2 launch.json配置说明 4. 远程开发5. 其他配置 1. 配置python运行环境 安装python插件&#xff1a;点击VSCode左侧边栏中的扩展图标&#xff08;或按 CtrlShiftX&#xff09;&a…

即时设计好用吗?即时设计都有什么优势?

即时设计是否易于使用&#xff1f;即时设计有哪些易于使用的功能&#xff1f;假如你在寻找一个免费的Sketch 或者网页版本 PS&#xff0c;那么「即时设计」这是个不错的选择。这个云端 UI 设计工具允许您在不占用计算机内存的情况下使用任何设备。它可以快速存储您的设计文件&a…

AI教我学编程之SQL Server常见指令以及数据类型

前言 今天在工作的过程中&#xff0c;遇到了许多常见的属性&#xff0c;在此做下记录&#xff0c;方便以后查询 目录 SQL Server 常见指令 对话AI 光有概念怎么行 阶段总结 SQL Server关键字 边学边练 数据类型 看图说话 对话AI 数据类型我知道 括号里的神秘数字 疑问 边练…

Linux sudo与/etc/sudoers

sudo介绍 sudo命令可以让普通用户在执行需要超级用户权限的命令时&#xff0c;临时提升为超级用户。例如&#xff0c;普通用户可以使用sudo执行系统管理任务&#xff0c;如安装软件、修改系统配置等。访问控制&#xff1a;sudo命令通过sudoers文件中的配置&#xff0c;可以对用…