当前位置: 首页 > news >正文

Unity 简单打包脚本

打包脚本

这个打包脚本适用于做demo,脚本放在Editor目录下

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;public class BuildAB
{[MenuItem("Tools/递归遍历文件夹下的资源并打包")]public static void BuildDirectory(){//需要打包的文件夹路径string path = Application.dataPath + "/Res";List<string> list = new List<string>();GetFilePath(path, ref list);List<AssetBundleBuild> mult = new List<AssetBundleBuild>();for (int i = 0; i < list.Count; i++){string assetName = list[i].Replace(Application.dataPath, "Assets").Replace("\\", "/");string bundleName = Path.GetFileNameWithoutExtension(assetName);AssetBundleBuild ab = new AssetBundleBuild();ab.assetBundleName = bundleName;//assetNames记录bundle中所有资源的相对路径ab.assetNames = new string[] { assetName };mult.Add(ab);Debug.Log($"{assetName} {bundleName}");}string targetPath = Application.streamingAssetsPath;if (Directory.Exists(targetPath))Directory.Delete(targetPath, true);Directory.CreateDirectory(targetPath);BuildPipeline.BuildAssetBundles(targetPath, mult.ToArray(),BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);AssetDatabase.Refresh();}[MenuItem("Tools/遍历文件夹下的资源,处理依赖并打包")]public static void BuildDirectoryDependence(){string path = Application.dataPath + "/Res";List<string> list = new List<string>();GetFilePath(path, ref list);//key 资源路径,value 引用计数Dictionary<string, int> abDict = new Dictionary<string, int>();for (int i = 0; i < list.Count; i++){string assetName = list[i].Replace(Application.dataPath, "Assets").Replace("\\", "/");//获取依赖资源,返回相对路径string[] dependences = AssetDatabase.GetDependencies(assetName);for(int j = 0; j < dependences.Length; ++j){if (dependences[j].EndsWith(".cs")){continue;}Debug.Log($"{assetName} 依赖 {j} => {dependences[j]}");if (abDict.ContainsKey(dependences[j])){abDict[dependences[j]]++;}else{abDict.Add(dependences[j], 1);}}}var enumerator = abDict.GetEnumerator();List<AssetBundleBuild> mult = new List<AssetBundleBuild>();while (enumerator.MoveNext()){string fileName = enumerator.Current.Key;int refCount = enumerator.Current.Value;string bundleName = Path.GetFileNameWithoutExtension(fileName);if(refCount > 1){//引用计数大于1的为公共资源,单独打包bundleName = "common/" + bundleName;}AssetBundleBuild ab = new AssetBundleBuild();ab.assetBundleName = bundleName;//assetNames记录bundle中所有资源的相对路径ab.assetNames = new string[] { fileName };mult.Add(ab);}string targetPath = Application.streamingAssetsPath;if (Directory.Exists(targetPath))Directory.Delete(targetPath, true);Directory.CreateDirectory(targetPath);BuildPipeline.BuildAssetBundles(targetPath, mult.ToArray(),BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);AssetDatabase.Refresh();}/// <summary>/// 递归获取所有文件路径/// </summary>public static void GetFilePath(string path, ref List<string> list){string[] files = Directory.GetFiles(path);for (int i = 0; i < files.Length; i++){if (files[i].EndsWith(".cs") || files[i].EndsWith(".meta")){continue;}list.Add(files[i]);}string[] dirs = Directory.GetDirectories(path);for(int i = 0; i < dirs.Length; i++){GetFilePath(dirs[i], ref list);}}
}

在这里插入图片描述
前面的选项不会处理依赖关系,公共资源会打进不同的bundle里
后面的选项会处理依赖资源,引用计数大于1的认为是公共资源,单独打包到common文件夹

加载脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class LoadAB : MonoBehaviour
{private AssetBundleManifest _manifest;private List<string> _abList = new List<string>();private Dictionary<string, GameObject> _assetDict = new Dictionary<string, GameObject>();void Start(){LoadManifest();LoadGameObject("cube");}void LoadManifest(){AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/StreamingAssets");_manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");}private void LoadGameObject(string abName){if (string.IsNullOrEmpty(abName))return;abName = abName.ToLower();//先加载依赖资源string[] dependens = _manifest.GetAllDependencies(abName);for (int i = 0; i < dependens.Length; ++i){if (!_abList.Contains(dependens[i])){AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + dependens[i]);_abList.Add(dependens[i]);}}if (!_abList.Contains(abName)){AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + abName);_abList.Add(abName);_assetDict.Add(abName, ab.LoadAsset<GameObject>(abName));}if (_assetDict.ContainsKey(abName)){GameObject.Instantiate(_assetDict[abName]);}}
}

参考

untiy AssetBundle 依赖关系树

相关文章:

Unity 简单打包脚本

打包脚本 这个打包脚本适用于做demo&#xff0c;脚本放在Editor目录下 using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine;public class BuildAB {[MenuItem("Tools/递归遍历文件夹下…...

基于社区电商的Redis缓存架构-缓存数据库双写、高并发场景下优化

基于社区电商的Redis缓存架构 首先来讲一下 Feed 流的含义&#xff1a; Feed 流指的是当我们进入 APP 之后&#xff0c;APP 要做一个 Feed 行为&#xff0c;即主动的在 APP 内提供各种各样的内容给我们 在电商 APP 首页&#xff0c;不停在首页向下拉&#xff0c;那么每次拉的…...

Python提取PDF表格(基于AUTOSAR_SWS_CANDriver.pdf)

个人学习笔记&#xff0c;仅供参考。 需求&#xff1a;提取AUTOSAR SWS中所有的API接口信息&#xff0c;用于生成C代码。 此处以AUTOSAR_SWS_CANDriver.pdf为例&#xff0c;若需要提取多个SWS文件&#xff0c;遍历各个文件即可。 1.Python包 pdfplumber是一款完全用python开…...

UVa1583生成元(Digit Generator)

题目 如果x加上x的各个数字之和得到y&#xff0c;也就是说x是y的生成元。给出n(1<n<100000)&#xff0c;求最小生成元。无解则输出0。 输入输出样例 输入 3 216 121 2005输出 198 0 1979思路 要想解决这个题目&#xff0c;只需要对每一个输入的值从1开始遍历找到小于…...

【Springboot+vue】如何运行springboot+vue项目

从github 或者 gitee 下载源码后&#xff0c;解压&#xff0c;再从idea打开项目 后端代码处理 这是我在gitee下载下来的源码 打开之后&#xff0c;先处理后端代码 该配置的配置&#xff0c;该部署的部署 比如将sql文件导入数据库 然后去配置文件更改配置 然后启动项目 确保…...

拥抱变化,良心AI工具推荐

文章目录 &#x1f4a5; 简介&#x1f344; 工具介绍&#x1f353; 功能特点&#x1f957; 使用场景&#x1f389; 用户体验&#x1f9e9; 下载地址&#x1f36d; 总结 &#x1f4a5; 简介 我是一名资深程序员&#xff0c;但薪资缺对不起资深两个字&#xff0c;为了生存&#x…...

Tensorflow的日志log记录

if OUTPUT_GRAPH:tf.summary.FileWriter("logs/", sess.graph)自动创建文件夹log...

C-语言每日刷题

目录 [蓝桥杯 2015 省 A] 饮料换购 题目描述 输入格式 输出格式 输入输出样例 # [蓝桥杯 2023 省 A] 平方差 题目描述 输入格式 输出格式 输入输出样例 说明/提示 【样例说明】 [NOIP2001 普及组] 数的计算 题目描述 输入格式 输出格式 输入输出样例 说明/提示 样例 1 解释 数据…...

十五届海峡两岸电视主持新秀大会竞赛流程

海峡两岸电视主持新秀会是两岸电视媒体共同举办的一项活动&#xff0c;旨在为两岸年轻的电视主持人提供一个展示才华的舞台&#xff0c;促进两岸文化交流和青年交流。本届新秀会是第十二届海峡两岸电视艺术节的重要活动之一。本次竞赛赛制流程如下&#xff1a; &#xff08;1&…...

安全行业招聘信息汇总

1. 阿里巴巴-淘天集团-安全部 社招岗位&#xff1a;Java开发 招聘层级&#xff1a;P5-P6 工作年限&#xff1a;本科毕业1-3年&#xff0c;硕士毕业1-2年 base地点&#xff1a;杭州 职位描述 负责淘天安全部风控基础标签平台0到1能力建设及产品规划和落地。负责标签应用的产品…...

【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更新driver

之前讲到基于python的自动化测试环境&#xff0c;需要安装Python,再安装Selenium。具体可看【如何学习Python自动化测试】—— 自动化测试环境搭建 但是&#xff0c;想要使用Selenium发送指令模拟人类行为操作浏览器&#xff0c;就需要安装浏览器驱动。不同的浏览器需要安…...

Spring Data Redis切换底层Jedis 和 Lettuce实现

1 简介 Spring Data Redis是 Spring Data 系列的一部分&#xff0c;它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象&#xff0c;还支持Jedis和Lettuce两种连接方式。 可通过简单的配置就能连接Redis&#xff0c;并且可以切换Jedis和Lett…...

wireshark自定义协议插件开发

目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…...

一文读懂MongoDB的全部知识点(1),惊呆面试官。

文章目录 01、mongodb是什么&#xff1f;02、mongodb有哪些特点&#xff1f;03、你说的NoSQL数据库是什么意思&#xff1f;NoSQL与RDBMS直接有什么区别&#xff1f;为什么要使用和不使用NoSQL数据库&#xff1f;说一说NoSQL数据库的几个优点?04、NoSQL数据库有哪些类型?05、M…...

仅仅通过提示词,GPT-4可以被引导成为多个领域的特定专家

The Power of Prompting&#xff1a;提示的力量&#xff0c;仅通过提示&#xff0c;GPT-4可以被引导成为多个领域的特定专家。微软研究院发布了一项研究&#xff0c;展示了在仅使用提策略的情况下让GPT 4在医学基准测试中表现得像一个专家。研究显示&#xff0c;GPT-4在相同的基…...

23.Oracle11g的UNDO表空间

Oracle的UNDO表空间 一、UNDO表空间概述1、什么是UNDO表空间2、UNDO表空间的作用2.1 提供一致性读2.2 回滚事务2.3 实例恢复 3、UNDO表空间的工作机制 二、UNDO表空间的相关操作1、UNDO表空间的创建2、UNDO表空间的管理 三、Oracle 11g中UNDO表空间的新特性1、UNDO表空间自动管…...

Mybatis 操作续集2(结合上文)

Mybatis 是一个持久层框架,用于简化数据库的操作,和Spring 没有任何关系,我们现在能使用它是因为 Spring Boot 把Mybatis 的依赖给引入进来了,在 pom.xml 里面 Mybatis 如何进行重命名? 看最后两行代码,这样就能重命名了 package com.example.mybatisdemo.mapper;import com…...

LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…...

12.整数转罗马数字

C不能像Python那样使用c*num的形式&#xff0c;重复字符&#xff0c;老老实实减吧。 class Solution { public:string intToRoman(int num) {string ans "";int res num;while (res ! 0) {if (res > 1000) {ans M;res - 1000;} else if (res > 900) {ans …...

免费AI洗稿软件【2023最新】

很多时候我们需要通过文字来表达观点、推广产品或服务。然而&#xff0c;长时间的文稿创作不仅费时费力&#xff0c;还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…...

PTA:平方回文数

题干 在数学里面&#xff0c;有一种数字正着读和反着读结果都一样&#xff0c;我们把这种数称为回文数。如果一个回文数&#xff0c;它同时还是某一个数的平方&#xff0c;这样的数字叫做平方回数。 本题要求输出小于正整数N的所有平方回数。 &#xff08;注&#xff1a;个位数…...

从“AI证件照”到“AI译制片”,爆款AIGC应用的商业化迷思

让郭德纲飙英文、让霉霉说中文的翻译视频生成工具HeyGen和掀起AI证件照热潮的“妙鸭相机”一样&#xff0c;在一阵疯狂刷屏之后&#xff0c;又迅速在各大群里销声匿迹了。 十月份&#xff0c;由HeyGen制作的各种明星跨语言翻译视频&#xff0c;在全网疯传&#xff0c;大家震撼于…...

JAVA代码优化:Easy Excel(操作Excel文件的开源工具)

Easy Excel官网&#xff1a; EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) https://easyexcel.opensource.alibaba.com/ Easy Excel的特点和优势&#xff1a; 简单易用&#xff1a;Easy Excel提供了简洁的API&#xff0c;使用起来非常方便。开发…...

Linux Python ping3库使用教程(ping3命令、ping命令)

文章目录 Linux Python ping3库使用教程1. 环境准备2. ping3库安装3. ping3基本使用4. ping3进阶使用5. 常见问题解答5.1 ping3库可以在Windows系统中使用吗&#xff1f;5.2 如何处理ping操作超时的情况&#xff1f;5.3 ping3库支持IPv6吗&#xff1f; Linux Python ping3库使用…...

分享一些基于php商城案例

案例1&#xff1a; ​​​​​​http://www.9520.xin/ 案例2&#xff1a; http://ptll.hasbuy.com/ 案例3&#xff1a; http://likeshop.9520.xin/mobile 案例4&#xff1a; http://www.hasbuy.com/...

SpringSecurity 三更草堂 学习笔记

SpringSecurity从入门到精通 0. 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的…...

基于Java SSM仓库管理系统

企业仓库有多个库房&#xff0c;用来分别存放生产需要的各种零件&#xff0c;仓库管理系统对此进行科学的管理。仓库管理系统管理的对象及操作如下&#xff1a; 管理员信息&#xff1a;工号、姓名、性别、年龄、电话、工资等。 库房信息&#xff1a;编号、地址、面积等。 零件信…...

基于Spark对消费者行为数据进行数据分析开发案例

原创/朱季谦 本文适合入门Spark RDD的计算处理。 在日常工作当中&#xff0c;经常遇到基于Spark去读取存储在HDFS中的批量文件数据进行统计分析的案例&#xff0c;这些文件一般以csv或者txt文件格式存在。例如&#xff0c;存在这样一份消费者行为数据&#xff0c;字段包括消费…...

Docker镜像制作与推送

目录 Docker镜像制作 搭建私服 将本地镜像推送到私有库 Docker镜像制作 以创建一个新ubuntu镜像&#xff0c;并安装vim命令示例 运行一个ubuntu镜像&#xff0c;发现在镜像里面无法使用vim命令&#xff0c;因为该ubuntu镜像只包括了其最基本的内核命令 [rootlocalhost ~]…...

Pandas时序数据分析实践—基础(1)

目录 1. Pandas基本结构2. Pandas数据类型2.1. 类型概述2.1.1. 整数类型&#xff08;int&#xff09;&#xff1a;2.1.2. 浮点数类型&#xff08;float&#xff09;&#xff1a;2.1.3. 布尔类型&#xff08;bool&#xff09;&#xff1a;2.1.4. 字符串类型&#xff08;object&a…...