Unity--AssestBundles--热更新

使用Node.js搭建AssestBundle服务器并验证AB包热更新

一、服务器部分

使用NodeJs作为服务器, 使用Express为基础网页模版。 当然, 使用其他的FTP,http服务器也可以, 基础逻辑是存放资源的位置。

1.下载Node.js

下载地址:https://nodejs.cn/download/

NodeJs1

2.安装NodeJs软件

下一步,下一步,下一步安装即可

3.创建目录:

由于我们需要为AssestBundle建立一个服务器, 因此我们需要再本地创建一个目录来存放相关的内容。

当然, 也可以在Unity中与Assest目录的平级目录中创建WebServer目录。你可以自定义WebServer的文件夹路径 然后再WebServer中创建一个WWW_Root的目录,用来专门存放我们需要进行热更新的AB包。

在这里插入图片描述

4.创建express模版

使用NodeJs创建express静态网页模版。

在当前目录中,即WebServer的目录中打开cmd或者PowerShell。 你也可以直接打开cmd控制台窗口,然后切换到WebServer的目录中。下图中红色部分是标记了路径, 你只需要切换到对应的路径即可。然后输入 npm install express 进行安装express。

npm install express

在这里插入图片描述

5.编写NodeJs服务器启动脚本

安装完毕后express后, 编写服务器的启动脚本, 创建一个main.js的文件。

然后粘贴如下代码,

var express = require("express");
var path = require("path");var app = express();
// http://127.0.0.1:8888/AssetBundles/Win64/Test/building.ab
// 该路径是我们前面打好包的路径==>服务器的地址
app.use("/", express.static(path.join(process.cwd(), "WWW_Root")));
// 端口号
app.listen(8888);

6.启动NodeJs服务器

在cmd或者powerShell中输入node ./main.js启动服务器。 不要关闭该窗口。
在这里插入图片描述

7.验证服务器是否启动成功。

打开浏览器,输入地址:端口号以及文件组成的一个完整的url地址。

例如,我将打好包的AB包放在了我的根目录, 这里需要和第二部分Unity中的打AB包的位置一致。

H:\UnityProjects\2022_ResMgr\WebServer\WWW_Root\AssetBundles\Win64\Test

由于上面写的main.js文件中的js代码是将WWW_Root映射为当前Nodejs的工作目录(cwd=current work directory), 因此,我们在浏览器中访问的路径为127.0.0.1:8888/AssetBundles/Win64/Test/house.ab。 这里的端口和图上的有点不一样, 按照实际你设置的端口为准。

127.0.0.1:8888/AssetBundles/Win64/Test/house.ab

在这里插入图片描述

如果你输入后的结果和上图一样, 你能保存文件,就代表着你的NodeJs服务器是启动好了的。

二、Unity部分

1.打AB包

Unity中配置AB包, 注意资源的位置。我这里是将一个房子的预制体打AB包, ab包的包名为house, 后缀名为ab。如果下图所示。 所以完整的包名为house.ab
在这里插入图片描述

2.拷贝ab包到服务器上

构建AB包后, 将打好的AB包放到我们前面提到的文件夹下, 也就是服务器中的目录。如下图所示, 你可以根据你点击浏览的目录来找到你需要存放的AB包。 在实际开发中,建议将ab包拷贝到StreamingAssests中, 方便进行测试。

在这里插入图片描述

3.使用下载并使用AB包

在Unity端口, 如何下载并使AB包呢。

思考一下, Unity需要联网, 因此,我们可以使用WWW类或者UnityWebRequest来请求一个服务器来下载文件。

当然, 如果WWW在代码中提示过时, 你应该使用UnityWebRequest来下载。需要注意的是, 下载的文件是直接加载内存中的, 因此你无法在项目的文件夹目录中找到你使用 UnityWebRequest 或者WWW下载的AB包。 下面是测试代码

代码如下:

using System;
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;public class GameLanch : MonoBehaviour
{AssetBundle ab;// ab包对应服务器的位置or文件夹string resUrl = "http://127.0.0.1:8888/AssetBundles/Win64/Test/house.ab";void Start(){// 资源检测和更新StartCoroutine(CheckRes());}IEnumerator CheckRes(){// 构建请求的AB包的 UnityWebRequestUnityWebRequest uwr = UnityWebRequestAssetBundle。GetAssetBundle(resUrl);yield return uwr.SendWebRequest();if (uwr.result != UnityWebRequest.Result.Success){Debug.LogError(uwr.error);}else{Debug.Log("Download success!");// 获取下载内容ab = DownloadHandlerAssetBundle.GetContent(uwr);if (ab != null){// 从包中加载预制体GameObject housePrefab = ab.LoadAsset<GameObject>("Assets/Arts/AssetsPakage/maps/level1/House_D_3.prefab");if (housePrefab != null){GameObject.Instantiate(housePrefab);}else{Debug.Log("mapPrefab is null");}}// 卸载AB包ab.Unload(false);}}}

4.测试效果

将脚本挂载在场景中的物体上, 为了检验是否能够加载我们下载的AB包, 我们将原来存放的预制体删除。然后运行代码。下面是测试结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI动漫翻唱项目玩法拆解,起号涨粉咔咔猛,实操干货分享

最近&#xff0c;一种把AI技术和动漫翻唱结合起来的视频&#xff0c;在各大平台火了起来&#xff0c;成了社交媒体的新热门。 下面&#xff0c;我们就来聊聊这种视频的制作方法和赚钱技巧&#xff0c;希望能给你的副业加点料。 一、AI动漫翻唱视频的魅力 AI动漫翻唱视频能迅…

[Luogu 4630] APIO2018 铁人两项(广义圆方树)

铁人两项 求满足存在 x → y x \rightarrow y x→y 和 y → z y \rightarrow z y→z 的不相交简单路径的有序点对 ( x , y , z ) (x, y, z) (x,y,z) 的方案数。 即&#xff0c;选择的路径只经过同一个点至多一次。 线性做法。 广义圆方树 可以解决一些“每个点至多经过…

MySQL进阶之(十一)MySQL事务日志-redo log

十一、MySQL事务日志-redo log 11.1 Buffer Pool11.1.1 缓存的重要性11.1.2 InnoDB 的 Buffer Pool11.1.3 InnoDB 存储引擎线程 11.2 redo 日志引入11.3 redo 日志的好处和特点11.3.1 好处11.3.2 特点 11.4 redo 日志的组成11.5 redo 日志的整体流程11.6 redo 日志的刷盘策略11…

nodejs 实现docker 精简可视化控制

地址 https://github.com/xiaobaidadada/filecat 说明 使用react 和nodejs 实现的非常轻量的服务docker管理。

YOLOv11改进-卷积-引入小波卷积WTConv 解决多尺度小目标问题

本篇文章将介绍一个新的改进机制——WTConv&#xff08;小波卷积&#xff09;&#xff0c;并阐述如何将其应用于YOLOv11中&#xff0c;显著提升模型性能。YOLOv11模型相比较于前几个模型在检测精度和速度上有显著提升&#xff0c;但其仍然受卷积核感受野大小的限制。因此&#…

【Wireshark笔记】如何在Wireshark中使用过滤器去除TCP Dup ACK

【Wireshark笔记】如何在Wireshark中使用过滤器去除TCP Dup ACK 在网络分析和故障排查中&#xff0c;Wireshark是最常用的工具之一。当分析TCP流量时&#xff0c;我们经常会遇到TCP Dup ACK&#xff08;重复ACK&#xff09;包。这些包通常意味着网络中的丢包或重传&#xff0c…

JRT怎么从IRIS切换到PostGreSql库

1.执行M导出得到建库脚本文件 2.下载生成的脚本到本地D盘 3.修改驱动为PostGreSql 4.修改连接串 5.到PostGreSql里面创建一个jrtlis的数据库&#xff0c;模式为jrt 6.启动网站点击导入脚本按钮 导入完成了就可以正常使用PostGreSql库了

QToolButton工具按钮控件

QToolButton是Qt框架中的一个特殊且功能丰富的控件&#xff0c;它主要用于工具栏或类似场景中&#xff0c;为用户提供快速访问命令或选项的按钮。通常是文字或图片或者图片文字&#xff01; 构造函数 explicit QToolButton(QWidget *parent nullptr); 初始化添加图片 QToolB…

Redis中String类型常见的应用场景

目录 一. 缓存功能什么是缓存?Redis的工作原理热点数据的过期策略是什么? 二. 计数功能三. 会话(session)共享Session会话是用来解决什么问题的使用Redis集中管理Session 一. 缓存功能 什么是缓存? 缓存是一种用于存储数据的计算机硬件或软件组件. 缓存核心功能是加快数据…

VSCODE 导入cubeide工程

1.下载vscode及插件STM32 VS Code Ectersion 版本号1.0.0&#xff0c;之后这个有导入功能。 2.等待自动安装对应插件&#xff0c;提示缺少什么就补什么 3.在左侧出现stm32图标。点击Import a local project导入本地项目。 4.报错 [{"resource": "/f:V11/cmak…

批量合并同名Labelme标注文件内容

假如一批数据&#xff0c;分两批分别标注了分割和关键点的json数据&#xff0c;或是分别标注了不同的类别&#xff0c;使用时如果要合并使用&#xff0c;就需要对两个同名的json文件进行合并。 json1: json2: 合并后json&#xff1a; 脚本内容如下&#xff1a; import os imp…

HubSpot的AI技术:企业营销和销售的好帮手

现在做生意&#xff0c;竞争真挺大的。大家都想找到更好的方法来做营销和销售。HubSpot的AI技术&#xff0c;就像是给我们企业配了个智能小助手&#xff0c;让营销和销售变得更加轻松、高效。 推荐你喜欢的东西&#xff0c;购物更开心 企业老板肯定知道&#xff0c;让客户开心…

html 登入界面,用户注册界面相关的标签及案例

案例效果图 以上界面的完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

C++ 游戏开发:从基础到进阶

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Mistral AI推超强边缘AI模型Ministral 8B,支持128000个token

最近&#xff0c;法国人工智能初创公司 Mistral AI 宣布了他们的新一代语言模型 ——Ministral3B 和 Ministral8B。 这两款新模型是 “Ministraux” 系列的一部分&#xff0c;专为边缘设备和边缘计算场景而设计&#xff0c;支持高达128&#xff0c;000个 token 的上下文长度。…

Leetcode 字符串解码

该代码的算法思想可以分为以下几个步骤&#xff1a; 1. 使用栈来处理嵌套结构&#xff1a; 我们需要处理像 k[encoded_string] 这种格式&#xff0c;其中的 encoded_string 可能是嵌套的&#xff0c;即像 3[a2[c]] 这样的输入。因此&#xff0c;我们可以借助 栈&#xff08;S…

springboot 项目集成spring security(极简版)

背景 当服务需要暴露于公网的时候&#xff0c;经常需要有登录功能。通过sping security 进行一个简单的登录功能。 导入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

Android Framework AMS(06)startActivity分析-3(补充:onPause和onStop相关流程解读)

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS通过startActivity启动Activity的整个流程的补充&#xff0c;更新了startActivity流程分析部分。 一般来说&#xff0c;有Activ…

第 2 章 ROS通信机制

机器人是一种高度复杂的系统性实现&#xff0c;在机器人上可能集成各种传感器(雷达、摄像头、GPS...)以及运动控制实现&#xff0c;为了解耦合&#xff0c;在ROS中每一个功能点都是一个单独的进程&#xff0c;每一个进程都是独立运行的。更确切的讲&#xff0c;ROS是进程&#…

关于Linux自带的python2.6.6升级到2.7.5版本步骤详解

CentOS 6 系统默认 Python 版本是:2.6.6 平时在使用中遇到很多的库要求是 2.7.x 版本的库。比如使用UFR升级启动脚本用python2.6.6的版本启动状态检测报错: 第一步:安装相关的编译依赖包: [root@testhost250 ~]# sudo yum install -y gcc [root@testhost250 ~]# sudo yum …