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

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

  • 前言
  • 一、服务端搭建
  • 二、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的逻辑其实跟简单,大致可以分为:向服务端请求模型文件、保存模型、加载模型。

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

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)

阿里的FunAsr对Whisper中文领域的转写能力造成了一定的挑战&#xff0c;但实际上&#xff0c;Whisper的使用者完全可以针对中文的语音做一些优化的措施&#xff0c;换句话说&#xff0c;Whisper的“默认”形态可能在中文领域斗不过FunAsr&#xff0c;但是经过中文特殊优化的Whi…

面试官:请问泛型擦除、泛型上界、泛型下界、PECS原则 是什么?

什么是泛型 泛型的本质是 类型参数化&#xff0c;解决类型爆炸的问题。 所谓泛型是指将类型参数化&#xff0c;以达到代码复用提高软件开发工作效率的一种数据类型。 然后我们要定义一个盘子 plate&#xff0c;注意这个盘子除了 装入食物food之外&#xff0c;还可以装其他的…

【Kubernetes】深入了解Kubernetes(K8s):现代容器编排的引领者

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xf…

leetcode — 贪心算法— 买卖股票的最佳时机

1 题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取…

无限学模式-“科研创新的加速器:全面掌握ChatGPT,推动研究方法和工作模式现代化!“

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

好书推荐丨豆瓣评出9.2高分!Python编程入门就看蟒蛇书

目录 写在前面 内容简介 业内专家推荐 编辑推荐 资源丰富 作者介绍 Q&A 粉丝福利 写在后面 写在前面 在这日新月异的科技新时代&#xff0c;编程如同一把万能钥匙&#xff0c;为无数人打开了通向无限可能的大门。而在众多编程语言中&#xff0c;Python无疑是最耀…

【CANoe使用大全】——DBC数据库制作

文章目录 1.DBC数据库选择1.1.DBC模板选择1.3. 新建报文1.4. 新建信号1.5.数值表建立 2. DBC导入 1.DBC数据库选择 首先找到DBC编辑器入口 1.1.DBC模板选择 举例说明&#xff1a; 新建选择CANFD的模板 1.3. 新建报文 注意上图中报文周期“Cycle Time”处于不可编辑状态…

【C++】介绍STL中list容器的常用接口

目录 一、STL中的list简介 二、构造函数 2.1 默认构造函数 2.2 填充构造&#xff08;用n个相同的值构造&#xff09; 2.3 迭代器构造 2.4 拷贝构造和赋值运算符重载 三、迭代器 3.1 正向迭代器 3.2 反向迭代器 四、容量相关 4.1 获取list中有效数据的个数 4.2 判…

【Web前端开发基础】CSS3之空间转换和动画

CSS3之空间转换和动画 目录 CSS3之空间转换和动画一、空间转换1.1 概述1.2 3D转换常用的属性1.3 3D转换&#xff1a;translate3d&#xff08;位移&#xff09;1.4 3D转换&#xff1a;perspective&#xff08;视角&#xff09;1.5 3D转换&#xff1a;rotate3d&#xff08;旋转&a…

使用StrictMode优化Android应用程序的ANR率

使用StrictMode优化Android应用程序的ANR率 本文将解释StrictMode是什么以及如何在Android应用程序中使用它作为ANR观察器。 什么是StrictMode以及为什么使用它&#xff1f; StrictMode是帮助开发人员防止ANR并减少在Android系统中产生ANR的机会的工具之一。 从developer.a…

抖音跳转微信公众号是怎么实现的丨数灵通

抖音是一款非常流行的社交媒体应用程序&#xff0c;用户可以在其中分享短视频和互动内容。许多用户希望通过抖音来引流到他们的微信公众号&#xff0c;以扩大影响力并吸引更多粉丝。以下是一些关于如何在抖音上跳转到微信公众号的科普信息&#xff1a; 1.信息流广告&#xff1a…

elementplus Dialog 对话框设置距离页面顶部的距离

默认为 15vh&#xff0c;当弹窗过于高的时候&#xff0c;这个距离其实是不合适的 <el-dialogv-model"dialogVisible"title"Tips"width"30%":before-close"handleClose"top"6vh"><span>This is a message</s…

leetcode:2859. 计算 K 置位下标对应元素的和(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之 和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的 置位 。 例如&#xf…

如何实现激光雷达运动补偿,这篇就够了

目录 激光雷达为什么会存在运动畸变 激光雷达如何运动去畸变 C++实践激光雷达运动补偿(辅助传感器) 实践激光雷达ICP运动补偿 参考文献 激光雷达为什么会存在运动畸变 首先要理解为什么会产生运动畸变。激光雷达扫描物体形成点云的过程自身伴随着旋转运动,每次激…

嵌入式-stm32-江科大-EXTI外部中断

一&#xff1a;EXTI外部中断&#xff08;external interrupt&#xff09; 1.1 STM32 中断系统 中断是指在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前的程序&#xff0c;转而去处理中断程序&#xff0c;…

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

【基础算法练习】二分模板

文章目录 二分模板题二分的思想C 版本的二分整数二分模板 Golang 版本的二分整数二分模板 例题&#xff1a;在排序数组中查找元素的第一个和最后一个位置题目描述C 版本代码Golang 版本代码 二分模板题 704. 二分查找&#xff0c;这道题目是最经典的二分查找&#xff0c;使用于…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及&#xff0c;L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 &#xff08;ADAS&#xff0c; Advanced driver-assistance system&#xff09;分“感知层、决策层、执行层”三个层级&#xff0c;其中感知层是最重要的一环…

不同页面加载对爬虫的影响

目录 前言 1. 不同页面加载方式对爬虫的影响 1.1 静态页面加载 1.2 动态页面加载 2. 使用代理IP进行访问 总结 前言 在进行网络爬虫的过程中&#xff0c;不同的网页加载方式可以对爬虫的效率和稳定性产生重要影响。有些网站可能会限制对其服务器的访问频率&#xff0c;如果…

怎么把ico图片转png?图片格式转换的快捷方法

ICO是一种常用的图标文件格式&#xff0c;广泛用于软件应用的图标设计&#xff0c;然而&#xff0c;ICO格式的图片分辨率通常较低&#xff0c;因此在某些平台上无法满足上传要求&#xff0c;为了解决这个问题&#xff0c;我们通常需要将ICO格式转换为常见的PNG格式或其他常用格…