news 2026/7/4 16:49:16

AB包自定义打包工具细分包策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AB包自定义打包工具细分包策略

为什么要自己写打包:细分包策略

我们知道Unity内置的打包方案是在右下角指定包名。

我们看到商业项目都在使用细分包策略,一个包装一个预制体,包括它的模型、材质、贴图、脚本。或者装一个图标、大图、声音、动画。一个游戏有上百个甚至上千个包。这样能做到最精准的热更,更新资源时下载最少的数据。

那么如果用Unity内置打包,就选一个预制体,选择它的依赖,全部打上包名。只是这个过程要重复几十上百次。

我们知道预制体路径都是要填在配表的,如果采用细分包,包名也要填到配表。那么在Unity内置工具把这些包名手填一遍就是大量重复劳动。

那么我们自然想到让编辑器工具读取配表去打包。

这里又分为两种策略,可以先根据配表设置包名,也可以直接打包。我们发现官方的工具在浏览包内容、依赖时是很好用的。所以采取工具设置包名-browser检查包内容和依赖-打包的策略。

细分包用内置设置包名后看起来是这样的。很明显不可能手填包名。

依赖处理、防止重复包含

使用

string[] deps = AssetDatabase.GetDependencies(path, true);

获得依赖。我们发现获取的依赖包括资源本身、脚本、着色器(包括内置着色器)。脚本、内置着色器是无法打包的。需要根据类型过滤后再设置包名。可以用白名单或者黑名单过滤。

打印一下所有依赖项的类型:

string[] deps = AssetDatabase.GetDependencies(path, true); foreach (string dep in deps) { importer=AssetImporter.GetAtPath(dep); UnityEngine.Object depObj = AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(dep); MyTools.Print("类型是"+depObj.GetType(), Color.green);

当依赖的包名已经不为空且和主资源包名不同时,需要某种处理。

如果想引起人的注意,直接弹窗,那么弹窗应该有几个选项?保持原名和设置为目标名字。但其实我们想要的是要么打成公共包,要么这些都打成一个包。

我们决定一个资源已经有包名时,放弃修改包名,打印报错。

public static T CheckRes<T>(string path, string ABName) where T : UnityEngine.Object { ABName= ABName.ToLower();//AB包名全是小写 T t = AssetDatabase.LoadAssetAtPath<T>(path); if (t != null) { MyTools.Print($"{path}存在。", Color.cyan); var importer = AssetImporter.GetAtPath(path); if (!string.IsNullOrEmpty(ABName)) { if (importer.assetBundleName != ABName) { importer.assetBundleName = ABName; MyTools.Print($"设置了{path}的AB包名为{ABName}"); } string[] deps = AssetDatabase.GetDependencies(path, true); foreach (string dep in deps) { importer=AssetImporter.GetAtPath(dep); UnityEngine.Object depObj = AssetDatabase.LoadAssetAtPath <UnityEngine.Object>(dep); MyTools.Print("类型是"+depObj.GetType(), Color.green); if (depObj is GameObject||depObj is Texture2D|| depObj is AudioClip) { if (!string.IsNullOrEmpty(importer.assetBundleName) && importer.assetBundleName != ABName) { //处理重复包含 Debug.LogError($"{dep}希望设置包名{ABName},但已经有包名{importer.assetBundleName},请手动处理!"); } else { importer.assetBundleName = ABName; } } } } } else { Debug.LogError($"在{path}找不到{typeof(T)}!!!"); } return t; }

同一个资源被指定2次包名

在配表里遇到了多个物品用一个图标。在批量设置包名时我是直接给Id加_Icon,很难注意到多个道具共用一个图标。

程序会检测出

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 16:49:05

FPGA加速脉冲神经网络:FireFly-P架构与机器人控制实践

1. 脉冲神经网络与FPGA加速概述脉冲神经网络&#xff08;Spiking Neural Network, SNN&#xff09;作为第三代神经网络模型&#xff0c;其最大特点是采用脉冲时间编码来传递信息&#xff0c;更接近生物神经系统的运作机制。与传统人工神经网络不同&#xff0c;SNN中的神经元只在…

作者头像 李华
网站建设 2026/7/4 16:47:06

AI工程实践:从个人脚本到团队基建的“造铲子”哲学

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 1. 先搞明白“造铲子”到底在说什么 在AI和软件工程领域&#xff0c;一个好点子本身不值钱&#xff0c;值钱的是能把这个点子快速、稳…

作者头像 李华
网站建设 2026/7/4 16:44:33

大模型安全实战:从漏洞复现到防御体系构建

1. 从“智能助手”到“安全靶场”&#xff1a;大模型安全为何成为新战场最近几年&#xff0c;大模型&#xff08;Large Language Model, LLM&#xff09;的浪潮席卷了几乎所有行业。从写代码、做PPT的智能助手&#xff0c;到分析数据、生成创意的超级大脑&#xff0c;它似乎无所…

作者头像 李华
网站建设 2026/7/4 16:41:15

Python+OpenCV实现疲劳检测系统开发指南

1. 项目概述 这个基于Python和OpenCV的疲劳检测系统是我在计算机视觉领域的一次实践探索。系统通过分析用户面部特征&#xff08;如眼睛状态、哈欠频率&#xff09;来判断疲劳程度&#xff0c;可应用于驾驶员监控、安全生产等场景。核心功能包括实时人脸检测、疲劳特征提取、数…

作者头像 李华
网站建设 2026/7/4 16:38:56

Notebook到生产环境的ML服务化实战:Triton+KEDA+特征供给闭环

1. 项目概述&#xff1a;这不是一次“部署上线”&#xff0c;而是一场从实验室到产线的系统性迁移“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着太多被新手忽略的潜台词。它不是教你怎么把model.fit()跑通&#xff0c;也不是演示…

作者头像 李华
网站建设 2026/7/4 16:35:11

胶质母细胞瘤多组学整合分析复现指南

1. 项目概述去年发表在Cell上的一篇胶质母细胞瘤多组学整合分析文章&#xff0c;最近在生信圈子里引起了广泛讨论。这篇文章的创新点在于同时整合了五种组学数据&#xff08;bulk转录组、单细胞转录组、空间转录组、ATAC-seq和代谢组&#xff09;并与临床预后数据进行了系统验证…

作者头像 李华