zoukankan      html  css  js  c++  java
  • UE4 生成多个Pak

    UE4默认情况下打包生成一个Pak,这对于小型游戏足够了,但对于大型游戏不太方便,
    单个pak文件太大对于打补丁非常不友好(非UE4默认Patch方案, 而是Xdelta3/BSDiff类方案),
    UE4内置了拆分Pak的功能,是按照资源类型来划分, 感觉不太直观, 习惯上更期望安装目录划分pak,
    要实现安装目录划分,最简单的办法就是修改AutomationTool,在执行打包pak时,读取自定义配置,
    根据文件目录个配置项,拆分为多个pak. 这在源码版引擎上操作很友好,但在安装版引擎就不方便了,
    每次引擎更新都会覆盖对应的cs文件,反复修改很烦.
    故尝试通过其自带拆分pak的功能来实现安装目录分pak, 发现其代码中预留了自定义操作,
    只需要继承AssetManager,复写GetPackageChunkIds() 函数, 根据自定义配置来决定资源所属pak即可.
    注意:要将项目的AssetManager设置为自定义的AssetManager类方可生效.

    代码中读取ini应该可以优化,不必每次重新读取(只是需要额外处理刷新ini的时机)

    
    
    bool UMyGameAssetManager::GetPackageChunkIds(FName PackageName, const class ITargetPlatform* TargetPlatform, const TArray<int32>& ExistingChunkList, TArray<int32>& OutChunkList, TArray<int32>* OutOverrideChunkList /*= nullptr*/) const
    {
    	TArray<FString> Lines;
    	GConfig->GetSection(TEXT("MultiPaks"), Lines, GGameIni);
    	int32 Idx = 0;
    	for (auto It : Lines)
    	{
    		++Idx;
    		TArray<FString> KVStr;
    		It.ParseIntoArray(KVStr, TEXT("="));
    		if (KVStr.Num() == 2 && PackageName.ToString().StartsWith(KVStr[1]))
    		{
    			OutChunkList.Add(Idx);
    			return true;
    		}
    	}
    	OutChunkList.Add(0);
    	return true;
    }
    
    

    配置项:
    DefaultGame.ini

    
    [/Script/UnrealEd.ProjectPackagingSettings]
    bGenerateChunks=True
    
    
    [MultiPaks]
    +Pak0="/Game/Startup/"
    +Pak1="/Game/GameUI/"
    +Pak2="/Game/Blueprint/"
    +Pak3="/Game/Maps/"
    
    
    

    DefaultEngine.ini

    
    [/Script/Engine.Engine]
    AssetManagerClassName=/Script/MyGame.MyGamaeAssetManager
    
  • 相关阅读:
    如何把phpStorm打造成自己的专属IDE?
    PHP伪造referer突破网盘禁止外链(附115源码)
    PHP实现删除非站内外部链接实例代码
    Http Referer的一些总结
    jquery 选择器(name,属性,元素)大全
    Invoke 和 BeginInvoke 的真正涵义
    C# HashSet集合类型使用介绍
    Dev系列控件的AJAX使用Demo
    如何进行SVN数据迁移并保存版本号数据
    Window及document对象
  • 原文地址:https://www.cnblogs.com/rpg3d/p/14130335.html
Copyright © 2011-2022 走看看