Unity 打包 AssetBundle

打包出的AssetBundle区分平台  (windows  android  ios)

通过打出来的AssetBundle对应的Hash值来判断该资源是否有更新(没有改动的资源重新打包Hash是不会变得啦)

需要保存在文件中的值: AssetBundle名称、 AssetBundle的Hash 、AssetBundle的依赖项


第一步:在Unity中设置你要打包成AssetBundle的资源 例如 我要打包这三项


他们在Inspector面板最下方的AssetBundle名称分别是(若果没有设置的话点New 直接输入就好了)


textures/icon.imgz

materials/mater.matz

prefabs/sphere.prez

值得一提的是...这里的AssetBundle名称是不区分大小写的

第二步:写代码!编写编辑器扩展的代码

创建一个脚本 取名BuildAssets

添加引用 --using UnityEditor;

这里以Windows编辑器环境为例 (也就是Unity环境啦)

public class BuildAssets

{

//在Unity的菜单栏中写个按钮-按钮执行BuildAllAssetBundlesForWindow方法(这里属于Unity编辑器扩展的知识)

    [MenuItem("Build/BuildAsse tBundles/Windows")] 
    static void BuildAllAssetBundlesForWindows()
    {
        ChoosePlatform(RuntimePlatform.WindowsEditor);

    }


    private static void ChoosePlatform(RuntimePlatform platform)

    {

        //这个路径就是  打包后AssetBundle存放的路径

        //其实这个path最终的结果是 "Assets/AssetBundles/win

### Unity 打包 AssetBundle 程序闪退的原因分析与解决方案 在 Unity 中,当打包 AssetBundle 后运行程序时可能会遇到闪退的情况。这种现象通常由以下几个原因引起: #### 1. **资源加载失败** 如果通过 `MonoBehaviour.Instantiate(asset.LoadAsset("131"));` 实例化的对象依赖于未正确加载的资源,则可能导致崩溃[^2]。例如,在调用 `assetBundle.Unload(true)` 前未能确保所有资源都被正确引用。 - **解决方法**: 在卸载 AssetBundle (`assetBundle.Unload`) 之前,确认所有的资源已经被完全实例化并脱离对其原始数据的依赖。可以通过设置克隆的对象独立存在来实现这一点: ```csharp GameObject obj = Instantiate(asset.LoadAsset<GameObject>("131")); obj.transform.parent = null; // 断开可能存在的父级关系 ``` --- #### 2. **脚本丢失问题** 某些情况下,真机运行时可能出现脚本丢失的现象,这通常是由于 IL2CPP 的链接器优化移除了被认为无用的代码片段所致[^3]。 - **解决方法**: - 方法一:将缺失的脚本放置在 Scene 或 Resources 文件夹中作为临时引用,从而避免其被误删 (此方式适合快速验证)。 ```csharp public class DummyReference : MonoBehaviour { private Coffee.UIParticle.ParticleEffect effect; } ``` - 方法二:创建一个自定义的 `link.xml` 文件,并指定需要保留的程序集名称及其成员: ```xml <linker> <assembly fullname="Assembly-CSharp"> <type fullname="Namespace.ClassName" preserve="all"/> </assembly> </linker> ``` --- #### 3. **内存管理不当** 如果 AssetBundle 被过早释放而仍有活动的游戏对象正在使用其中的数据,也可能引发异常行为甚至应用崩溃。 - **解决方法**: 使用参数为 `false` 的版本卸载 AssetBundle 来仅清理未使用的资源而不影响已加载的内容: ```csharp assetBundle.Unload(false); ``` --- #### 4. **解压后的文件结构变化** 有时,解开 AssetBundle 后发现内部结构变得更加紧凑简洁,但这并不意味着它可以直接用于生产环境中的动态加载流程[^1]。因此需注意测试阶段所操作的是压缩前还是实际发布的版本。 - **建议措施**: 验证最终导出形式下的兼容性和稳定性;同时保持开发过程中对不同平台特性的充分考虑。 --- ### 总结 针对上述提到的各种可能性逐一排查即可有效降低因 AssetBundle 导致的应用退出风险。具体实施时应依据实际情况选取最合适的策略组合加以应对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值