找回密码
 立即注册
查看: 254|回复: 0

Unreal 安卓分包

[复制链接]
发表于 2022-11-25 11:49 | 显示全部楼层 |阅读模式
安卓包有 2G 大小的限制,超过这个阈值,就会报各种各样的错误,导致打包失败。虽然有各种别的办法可以临时逃脱这个限制,例如

勾选大文件,可以打出小于4G的包

但根本的办法还是分包。分包的步骤有这么几个:
一,项目设置


开启分包

二,划分Chunk


AssetsManager中设置区块信息


设置自定义资产

    这里有点要注意,Primary Asset Type 必须和 Asset 在 C++ 中定义的AssetType保持一致。例如:Map World ,那它的 Primary Asset Type 必须为 Map,否则规则不会被识别定义多个同类型的资产,只会识别一个,例如:在 Primary Asset Typres to Scan 中定义了两个 Map 类型,只有高优先级的被识别

如果我需要将某个大目录下的某个小目录另外打包,应该如何设置?这就要用到  Primary Asset Label 了。
三,使用 Primary Asset Label  特殊设置

      需要单独分包的文件夹内,右键单击,导航至Create Advanced Asset > Miscellaneous,然后创建一个新的Data Asset


创建数据资源.png

      选择Primary Asset Label作为新数据资产的基类。

    资产标签类型.png

    您可以在 C++ 中创建 PrimaryAssetLabel 的子类以添加额外的元数据。如果您在蓝图中为 PrimaryAssetLabel 创建子类,它们将无法用于分块目的。
      命名,这里命名为Label_Bonis

    LabelBorisAsset.png



    打开Label_Bonis并填写以下属性:

    LabelBorisSettings.png

PropertyValue
Chunk ID区块ID,最终会按这个ID分到不同的 APK中,默认-1,大于等于0才会生效
Priority优先级,默认为-1
Cook RuleCook 策略
Label Assets in My Directory将目录所有资产全按此标签执行,一般设为True

      Label_Bonis 加入 Primary Asset Typres to Scan 中,Label_Bonis 中的规则会覆盖 Primary Asset Typres to Scan 的规则

四,用资产审计工具(Asset Audit )检查分包情况:

    1,打开  “窗口”>“资产审计” Window > Asset Audit2,点击 Add Chunks ,就能找到你分好的区块,如果没有显示任何内容,请按步骤检查设置
五,设置入包过滤条件

UE 对 Android 默认提供了 ObbFilter 的功能,可以指定哪些文件要被添加到 Obb 中(pak/mp4)等。

控制方法只需要添加配置即可。
# Config/DefaultEngine.ini[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]+ObbFilters=-pakchunk1-*+ObbFilters=-pakchunk2-*+ObbFilters=-pakchunk3-*
ObbFilters 的规则以 - 开头就是排除规则,会把基础包中的 chunk1-3 的 pak 给过滤掉,可以用于后续的下载流程。

也可以指定 Exclute 和 Include 规则组合来用:
+ObbFilters=-*.pak+ObbFilters=pakchunk0-*
第一步忽略掉所有的 pak 文件,然后把 pakchunk0-*.pak 显式添加至 obb 中。
六,上传除主包之外的资源上CDN

一般是在打包后,将 pakchunk 后大于0的都上传到CDN,大概的脚步如下:
def find_base_pak(work_path):    if not path.exists(work_path):        print(f"ERROR {work_path} not exit")        return None    base_paks = []    for r, d, f in os.walk(work_path):        for ff in f:            local_path = f"{r}/{ff}".replace("\\", "/")            base_name = path.basename(local_path)            if base_name.startswith("pakchunk") and not base_name.startswith("pakchunk0") and base_name.endswith(                    ".pak"):                base_paks.append(local_path)    return base_paksdef upload(cdn_local_path, cdn_remote_path):    cmd_string = f"{UPLOAD_TOOL} --cmd=upload_file --remote={cdn_remote_path} --local={cdn_local_path}"    run_cmd(cmd_string)def push_pkg(version, work_path, cdn_remote_path):    paks = find_base_pak(work_path)    if paks is None:        return    for pak in paks:        upload(pak, f"{cdn_remote_path}/{path.basename(pak)}")七,下载入包

这个逻辑和项目关联性比较大,可以按照实际情况处理,这里分享下unreal 官方的一套方案:Chunkdownloader

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-27 22:35 , Processed in 0.127468 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表