UnrealPak的使用笔记

UE4的打包可以通过编辑器直接进行,但是当要实现一些特殊的目标,例如热更新等时,就需要自己使用UnrealPak进行才行。

当前使用UE4版本4.16,所有打包在Shiping模式下测试过。

UnrealPak

UnrealPak在整个打包过程中位于最后面的一个过程,在编辑器中打包的话可以通过输出判断打包的各个阶段。在编译、烘焙之后,如果有勾选Use Pak这个选项的话,引擎就会尝试将以上两个过程中生成的内容打包到Pak中去。

UnrealPak.exe位于引擎目录下Engine/Win64中,运行程序,在错误提示中有给出基本的使用方法:

UnrealPak <PakFilename> -Test

UnrealPak <PakFilename> -List

UnrealPak <PakFilename> -Extract <ExtractDir>

UnrealPak <PakFilename> -Create=<ResponseFile> [Options]

UnrealPak <PakFilename> -Dest=<MountPoint>

UnrealPak GenerateKeys=<KeyFilename>

UnrealPak GeneratePrimeTable=<KeyFilename> [-TableMax=<N>]

UnrealPak <PakFilename1> <PakFilename2> -diff

UnrealPak -TestEncryption

Options:

-blocksize=<BlockSize>

-bitwindow=<BitWindow>

-compress

-encrypt

-order=<OrderingFile>

-diff (requires 2 filenames first)

-enginedir (specify engine dir for when using ini encryption configs)

-projectdir (specify project dir for when using ini encryption configs)

-encryptionini (specify ini base name to gather encryption settings from)

-encryptindex (encrypt the pak file index, making it unusable in unrealpak without supplying the key)

整个程序大致的功能就是可以解压和打包Pak文件:

GenerateKeys

生成加密Key到文件中,RSA用于对Pak进行签名。

P:用于RSA的素数p

Q:用于RSA的素数q

GeneratePrimeTable

生成素数表,

TableMax:生成表的停止(最大)数值,默认值10000

TestEncryption

测试加密算法的执行,并不检测具体的Key和文件。

TEST

对Pak文件进行检测,会对每一个文件进行SHA1校验。

signed:Pak是否已签名

List

列出文件。

SizeFilter:文件的大小过滤器,会对大于这个大小的文件进行总Size的统计。

signed:Pak是否已签名

Diff

对比两个Pak文件

nouniques:通过指定nouniquesfile1、nouniquesfile2,是否列出Unique的文件

signed:Pak是否已签名,不能分开指定。

Extract

解包。

signed:Pak是否已签名

构建

blocksize:块大小,MB或KB单位

bitwindow:压缩的窗口大小,这个值越大压缩的效果越好,同时消耗的性能也越高。

patchpaddingalign:是否在进行Patch时启用对齐,不patch时对齐时自动的。

encryptindex:加密索引,使得文件索引在不提供key的情况下无法解密。

order:文件读取顺序列表,这个order在cook时会自动生成,一般不用自己提供。uexp会被加上序列值1 << 29和ubulk会被加上1 << 30。没有提供order的其他文件将获得 (1 << 28)。

sign:对Pak进行签名的RSA的key

 

create

文件列表,可在其中单独指定compress和encrypt,但是如果在命令行中指定了的话,就会被强制使用到所有文件。可以是目录或是使用*通配符。

generatepatch:生成Patch |同时可使用 TempFiles来指定临时目录

compress:压缩

encrypt:加密

 

dest

替换Pak中的MountPoint。

 

加密和压缩

Pak采用RSA进行签名,AES进行加密,SHA1进行校验。

加密的流程没有测试,加密的参数可以在ini文件Encryption中进行设置,要使用ini配置的话,需要指定-encryptionini。或者,可以直接在命令行中提供加密参数:

或者

其中第一个数是Exponent,第二个数是Module,第三个数是公钥的Exponent

来提供AES加密秘钥。

 

当前的ProjectLauncher打包,会自动添加-encryptionini,但是只要没有提供Encryption.ini,或者[Ini配置]不正确,就不会进行加密。配置文件的内容应该是类似这样的:

由于没有实际测试过,所以不是很明确Encryption的配置能否被打包后的程序自动加载。如果出现了问题,可以检查下CoreDelegate中的:

引擎在Mount时会从这两个Delegate中获取加密相关的信息,在CoreDelegate的Cpp中有提供

如果没有办法成功注册解密的话,可以尝试模仿引擎代码进行注册来调试一下。

 

不过事实上这些功能如果只是打包的话基本不用深究,在使用Project Launcer进行打包时,可以看到编辑器对UnrealPak的调用,将其复制出来,然后进行相应的修改就可以了。

在进行测试的时候需要注意,UE4对于Asset的加载是有要求的,如果是Shiping烘焙的内容,是无法在编辑器中加载的,必须统一内容的打包格式。

Mount

Pak在运行时通过Mount将内容读取到游戏中,如果不希望Pak文件被自动加载的话,可以不将其放到[自动加载目录]中。

手动加载Pak文件时,通常采用的Mount方法有两种。

手动Mount

这个方法可以手动指定MountPoint,但是通常情况下,除非很确定自己打包了什么,否则很容易丢失各个Asset之间的引用。

CoreDelegate

这个是最近的版本添加的帮助函数,比上面的方法更加的简单实用。

使用这个方法会将内容Mount到内容根目录,引擎内部加载Pak文件也是使用的这个方法。

路径与引用

一般情况下使用同一个项目打包的Pak文件,只要打包正确,进行Mount都不会有什么问题。

而如果使用其他项目进行打包的话,可能会存在一些引用丢失的问题。通常的表现是,使用Mount后的路径可以打开地图,但是地图内物品的材质等关联属性全部都丢失了。

这个问题通常都是路径问题引起的,另外,在Cook目录中会有AssetRegistry,这个文件是UE用来保存各个Asset之间的引用的,在网上有看到Mount时要自己加载并注册的描述,但是目前版本测试下似乎是会自动加载的。至少在没有主动加载AssetRegistry的情况下,引用已经是正常的了,但是如果出现了引用丢失的问题,可以从这个方面进行一下检查。而且使用CoreDelegate进行Mount的话,是不需要关心这个的。

在打包时主要的路径问题来自于打包时的处理机制,UnrealPak会尝试从所有待打包的文件中提取公共的目录作为根目录。而这个根目录之后会被挂在MountPoint之下,那么如果配置有不正确的话,必然会丢失引用。如果引用丢失了的话,对打包的根目录检查也是必要的。在使用-create=<ResponsFile>进行打包时,可以在每个文件列的后面指定打包的目标目录,可以一定程度的上解决这个问题。

实际使用

注意:这里记录的是目前项目中使用的路径,并不代表这是一个“好”的方法。因为UnrealPak自主打包无论如何都不会优雅,如果没有紧急的打包需求,建议等官方的Chunk机制等一系列打包功能完善之后直接使用~

首先,对目标项目ShipIssue进行打包,从Log中拷贝UnrealPak的记录:

然后,将要打包的项目FreePatch进行Cook之后,对拷贝的命令修改:

Order指令的文件可以直接使用Cook出来的,list.txt直接写:

目标目录写成目标项目的目录,这样的话打包出来的pak文件在自动加载和使用CoreDelegate加载后都能保持正确的引用。

如果保留原项目名

需要Mount时自己将MountPoint指定到../../../ShipIssue/,自动加载和CoreDelegate加载会加载到../../../FreePatch/导致无法读取到地图中物体引用的材质。

因此并不推荐这样做~

通常情况下,只要mount之后的路径在/ShipIssue/下的结构与原本在Content/下的结构相同,材质之类的引用就不会丢失。丢失的情况,一般从路径方面检查下先比较好。

更新:由于Pak的加载确实有些迷,经常会有朋友发邮件或者留言来问我。但是从打包到加载的过程中的可变量太多,我也无法准确的知道每个人遇到的问题。所以在这里将测试打包用到的代码分离成一个插件。

其实插件本身并不复杂,只是在使用UFS的API遍历访问而已。主要的作用是可以方便对加载过程的理解和问题的排查。详情请参考[UE4文件查看插件]。

本博客所有内容遵循CC BY-NC-SA 3.0协议, 如有转载,请注明出处。
60 条评论

    希望大佬可以在空闲的时间帮我解答下关于Pak资源加载的问题,万分感谢。我的QQ是64852791。3Q。


    你好,目前不怎么使用QQ呢。
    如果是简单的讨论的话可以发到我邮箱,太过复杂的话就爱莫能助了,最近都不是很有时间呢。


    老哥,想问问怎么实现一个有依赖关系的文件夹的Pak制作


    PAK其实只是将烘焙过的内容打包在一个文件里面,在Mount之后其实和在打包的时候选择不使用Pak直接生成的内容是一样的。

    如果依赖关系丢失的话,从Mount之后的路径开始检查比较好。


    其实我的意思是怎么把几次想用的文件单独打成一个pak包,我启动unrealPak.exe并不能用。


    为何会不能用呢?你命令行直接跳转到UnrealPak的目录再打开试试?


    按照楼主的方法在编辑器下能够正确加载pak的内容,但是打包后,无法正确加载pak会是什么原因不知楼主知道不


    没有在编辑器里试过呢,不过Development和Shipping的烘焙内容是不能通用的,不知你在打包pak的时候有没有对应打包模式烘焙过那些内容呢?


    请问楼主:我能在 Editor 的PIE下 使用pak mount(mountPoint = GameContentDir()) ,多种(LoadSyns、LoadPackage、StaticLoadObject)进行加载,但是都无法在打包输出后成功!

    1)请问你是用哪个函数获取的 pak解包后的 文件加载StaticLoadObject; LoadPackage;LoadSyns。这些加载函数,都有些什么使用限制(PIE下路径参数不同和打包后是否也是一致的)。

    2)请问:UnrealPak.exe 的*.uasset对象一定是Save\Cooked\下的吗,可以直接使用 ProjectName\content\下的吗?  打包解包后的uasset文件一定要和Editor下他们的原始路径一致吗?

    3)请问:不能打包后加载的可能因素会有哪些,非常感谢!!!

     


    我并没有在Editor下测试过Mount呢。

    之前在项目中使用pak的mount都是以map为中心组织的,所以并没有测试过StaticLoadObject; LoadPackage;LoadSyns这些函数的可用性。理论上mount之后的内容和直接不使用Pak的打包是一样的,重点跟一下Mount后的路径比较好。

    Saved\Cooked下的资源是烘焙过的,Content下的是未烘焙的。而且印象中Shipping烘焙的内容和Development的是不通用的,可能会导致加载失败。最好用Project Launcher进行打包,不勾选使用Pak就可以得到对应的烘焙内容。

    一般会出问题的话就上面两个方面:烘焙的形式不对、路径错了。

     


    请问,大佬可以分享工程让我们学习不


    不好意思,最近开了新坑,实在是没有时间对测试项目进行整理。
    主要的相关内容都写在文章里了,结合引擎代码跟一下的话应该不会有问题的。
    如果找到时间的话可能会进行进一步的整理,但是实际上UE4的打包机制目前还有些坑,如果没有紧急的发布需求的话,建议等引擎更新比较好哦~


    你好,内容挺不错,但是实际操作的时候还是遇到了一些问题,不知道楼主能否做个解答

    我生成了Encrypt 的ini 配置文件,也按照文章流程操作了一遍,但是加密后,我将项目复制到别人的电脑上,还是可以成功抽取工程内容,不知道是哪里出问题了,希望题主指点


    如果加密不成功的话,直接使用UnrealPak不提供解密秘钥就可以解包了。
    当时并没有测试过用ProjectLauncher进行加密打包,似乎还要填写EncryptEverything、EncryptPakIndex之类的额外指令才行。你可以看看生成的Response文件中有没有加上encrypt。指定了encrypt才会加密的。
    你也可以试试用UnrealPak直接加密。


    你好,文章解答了很多我的疑问,但是有些地方依然不太明白,请教一下:

    目前加载和挂载都成功了,但是使用异步加载资源的时候,一直提示找不到,可以给一些建议嘛?

     

    在Content/pakFile 目录下,我做了一个level2.pak ,想加载这个pak中的aboutResource 资源(Actor类型)

    一直会进入 “SynchronousLoad failed !!!”  LoadObject 异步读取一直失败,为空,这是为什么呢?谢谢

     


    你好,并没有做过异步加载的测试呢,建议你先确认路径是否正确,或者先用同步加载的方法试一试。


    你好,我在UE4的打包设置里打开了PAK加密。为什么出来的PAK都是未加密的状态。

    并且在UE4的打包加密选项内也没有设置密码的选项,只有打包加密INI进PAK和另外一个选项。

    还有我直接用cmd使用unrealpak.exe  输入aes=XXXXXXXXXX 打包出来的也是未加密的状态。

    我需要在什么地方设置吗?或者需要在哪里放入设置文件?

    谢谢。

     


    用命令行的话你可能需要额外指定-encrypt,另外4.19版本的加密配置已经可以在项目设置中进行了,建议尝试一下~


    能给一个命令行的范例吗。谢谢了。

    4.19版本的加密配置里只能自动生成密码不能手动修改吗?我看到控制面板里只有2个选项,一个是generate new.一个是clean.

    谢谢了0,0

    我手动命令行输入“UnrealPak.exe 输出位置 打包文件位置 -aes=xxxxxx -encrypt” 生成出来的文件还是不加密的。


    不知在最近的版本更新中有没有UnrealPak的使用方式变动,你直接使用4.19打包,过程中看它的输出Log中打出的UnrealPak的命令格式即可。
    另外,4.19的配置选项中确实是不能手动修改的,但它其实只是帮你配置DefaultCrypto.ini而已,你点过generate new的话在项目目录的config内会看到这个配置文件,然后根据需要进行改动就可以了。改完记得重启编辑器,或者最好在编辑器关闭的时候改~


    谢谢回复~我已经解决了。

    现在PO一下CMD命令给需要的人。

    ue4pak.exe 生成PAK路径 -create=含有打包文件夹路径的.txt -compress -encrypt -encryptindex -aes= BALABALALABA

    “文件夹内放你需要打包的任意文件”

    TXT内例子:C:\wenjian\*

    文件夹内例子:wenjian\baba\Content\xx.uasset

     

     


    你好,还有一个问题。

    我用这个方法生成出来的PAK。无法加载资源到游戏里。我用umodel查看了一下。

    正常的PAK是提示:mount point:”game”

    我这样生成的PAK是提示:XX.PAK has  strange point:”C:/GAME/CONTENT”,mounting to root.

    UE4pack log提示:LogPaths:Warning: No paths for game localization data were specifed in the game configuration.
    LogInit:Warning: No paths for engine localization data were specifed in the engine configuration.


    这两条Warning应该关系不大,没有怎么用过umodel所以不知道它是在什么情况下会报这个错误。
    看起来似乎是pack时mount point设置有问题,你的pack list是否是这样的形式的?:
    "E:\GameDev\FreePatch\Saved\Cooked\WindowsNoEditor\FreePatch\*" "../../../ShipIssue/*"
    没有指定第二个路径的话,UnrealPak会自动提取最高的共通路径作为mount root,可能会出现奇怪的状态。
    也有可能你的命令中没有指明-enginedir=”D:\Code\UE_4.16\Engine” -projectdir=”E:\GameDev\ShipIssue”这两个参数,没有它们pack时可能无法找到正确的路径。

    当然也有可能是别的地方有问题,建议直接跟踪下mount过程看它是如何报错的。
    PS: unrealpak的话最好的使用方法还是从编辑器里打包的cook的log里面把命令拷贝出来手动修改,因为这方面的文档并不是特别的全面,按照官方的使用方式往往比较方便些~


    谢谢,就是这PACK LIST的原因。我设置后路径正常加载成功了,所有生成的PAK都能正常工作。

    谢谢一直这么迅速的回答^ ^

     


    ue4pak.exe 生成PAK路径 -create=含有打包文件夹路径的.txt -compress -encrypt -encryptindex -aes= BALABALALABA

    “文件夹内放你需要打包的任意文件”

    TXT内例子:C:\wenjian\*

    文件夹内例子:wenjian\baba\Content\xx.uasset

    您好,根据这个命令,我打包出来的文件都有,但是根目录没有,比方应该是XX\XX\.UASSET     但是打出来只有XX\.UASSET


    如果你是根据这个信息打包的话,可以参考上面的回复中的建议。很有可能是pack list的格式指定问题~


    发现一个坑,test1项目打包资源,test2项目负责加载。由于两个项目的名称不一样会导致加载不出来,要换成相同的项目名后才能加载。导出项目和导入项目的名称必须一致,是不是要让ue4认为这两个项目是同一项目才能加载?


    因为编辑器打包时会自动将项目名称作为pak的mount point,所以如果项目名称不匹配的话就会导致解包后的文件无法正确的进入test2的项目目录,而是自己在UFS上挂了一个test1目录。
    如果你的test1是使用编辑器打包的话,在test2要加载就必须自己指定mount point才行呢,但是还是会破坏pak的自动加载流程。要想test1打包的话,可以自己构造UnrealPak的参数,指定好cook list的话就可以实现自动加载了。
    可以参考下文章最后一段的记录~


    你好,非常感谢你写的文章,对我帮助很大,我使用您写的插件对A工程进行PAK打包,并且在B工程中加载此PAK,在没有对PAK加密的时候是OK的,

    我在打包PAK的Command中加入了打包指令, -encrypt -encryptindex -aes= BALABALALABA,那么在B工程中怎样才可以加载加密以后的PAK呢?

    我使用的是 FPakPlatformFile类对PAK进行加载测试的,非常感谢

     


    如果你的项目中混合使用不同的加密方式,建议研究下这两个Delegate:

    static FPakEncryptionKeyDelegate& GetPakEncryptionKeyDelegate();
    static FPakSigningKeysDelegate& GetPakSigningKeysDelegate();

    引擎自己的使用方法在文中有,不过我没有测试过混合使用加密方案的情况~


    大佬你好,

    我想问下  PlatformFile->Mount(*pakPath, 0, *MountPoint) 后

    UObject* LoadObject = StreamableManager.SynchronousLoad(reference)

    出来的StaticMesh   它的材质引用会丢失是为什么?


    我想问下为什么。 FCoreDelegates::OnMountPak.IsBound() 总是return false?

    即使在Editor  或者打包出来的项目,它总是return false ,导致无法加载pak.

    除非我设置了以下步骤:

    IPlatformFile& InnerPlatformFile = FPlatformFileManager::Get().GetPlatformFile();
    FPakPlatformFile* PlatformFile = new FPakPlatformFile();
    PlatformFile->Initialize(&InnerPlatformFile, TEXT(“”));

     

    IsBound()会return false

    但是用Vistor去访问文件列表

    FileList = Vistor.Files;

    pak里的文件路径都显示为 …/…/../Binaries/Win64/xxx.uasset 这样的路径。

    用StaticLoadObject()   以/Game/xxx.xxx.读取 还是读不出来,好郁闷啊。


    IsBound()会return false  这里打错了。

    应该是PlatformFile->Initialize(&InnerPlatformFile, TEXT(“”));后,IsBound() return  true;

    但是用Vistor去访问文件列表

    FileList = Vistor.Files;

    pak里的文件路径都显示为 …/…/../Binaries/Win64/xxx.uasset 这样的路径。

    用StaticLoadObject()   以/Game/xxx.xxx.读取 还是读不出来,好郁闷啊。


    想问下楼主。

    调用  FPlatformFileManager::Get().SetPlatformFile(*PakPlatformFile)后

    在Editor中不能任何的uasset,也打开不了uasset文件


    不好意思最近工作比较忙没有到blog来看过,如文中所描述pak相关的操作我并没有在编辑器中测试过,所以不知道会遇到什么问题呢。

    异步加载的话建议先尝试进行同步加载是否能成功来判定引用路径是否正确,如果引用正确的话可能需要看看异步加载的API是否有什么问题。

    Pak里面的文件路径有问题的话,建议先使用UnrealPak检查下是否有打包方面的问题,另外FCoreDelegates::OnMountPak没有绑定的话你是在什么时机进行调用的呢?

    PS: 由于之前受到各种垃圾留言骚扰,所以现在blog的评论是开启了邮箱过滤的,只有之前留言有通过才会自动通过,因为你换邮箱了所以全部被阻挡了呢~


    感谢,看完受益良多,打包的过程我已经完全明白了,但是用它解包的时候出现了问题

    UnrealPak.exe XX.pak -Extract XX\XX

    我用这个命令解包出来PAK之后,其中的目录全部丢失了,打开之后就是文件

    是用少了命令吗,我想按照打包前的目录解包出来


    Extract印象中应当不需要额外指令,你可以用List指令来看看pak内部有哪些文件


    加密过后的文件list命令也可以用吗

    是否需要配合解密的命令

     


    应当是要的,不过我没试过,建议你自己试试~


    你好,我需要打开pak里面的map,假如有3个pak风别对应里面yo有3个map(A.B.C)。在选场景M界面选择第一次打开A速度正常,回退到M打开B速度变慢,回到M打开C更慢,再次回到M之后打开任意场景都会打不开(闪一下又会回到M)。有碰到过这种问题吗??希望给与支持…


    以前遇到过类似的情况,但是是使用level streaming才会有的,基本是前面的关卡没有卸载导致后面的关卡加载出现问题,不过看起来你的问题有点不一样?
    一般open map闪一下回到默认关卡是关卡不存在之类的,你可以仔细看看Log,既然它回到了原来的关卡,肯定有log给出原因的。


    每次打开完就要unmount一下吗?我怀疑是不是我没有unmount呀….


    不需要UnMount的,我遇到的那种是使用的LevelStreaming,需要Unload,如果是open的话按理是不会有问题的


    我发布的是development版


    如果是dev的话,应该在运行目录里面能够看到log的


    要打开pak中的地图的话,是不是mount完,就直接open就可以了呀,还需要其他的操作吗?


    设置正确的话确实直接open就可以的


    谢谢你的及时回复,发布出来是可以用的吗,我测试过不行,不知道具体哪里出问题啦。你能分享一个demo吗?非常感谢…


    Shipping测试是做过的,之前的项目主体和关卡就是分开的,不过当时测试项目很乱,由于工作比较忙一直没有时间做整理,所以并没有demo,建议你仔细跟踪下PAK的加载过程~


    好的,谢谢。你说的“项目主体和关卡就是分开的”是指,主题和关卡不是同一个项目吗?我也是这样的 而且两个项目的名称都是不一样的…


    嗯,项目名称不同的话会有些额外的操作,当时为了打包人员操作方便项目名称是一致的。


    您好,有个最新问题需要请教,以前ue4pak打包以后文件可以直接使用!

    现在进游戏加载会弹出一个消息对话框提示:

    Failed to open descriptor file ‘../../../xxx/xxx.uproject’

    有办法解决吗?是哪里的问题?我该从哪方面入手!


    如果印象没错的话,这个有可能是项目名称或者路径的问题。因为在实际运行的时候是从Binaries\Win64往外重新进行路径定位到uproject的。你可以看看是不是改过项目名称或者在pak里面mount之后没有对应的uproject文件。


    你好博主,

    很感谢您的分享,网上搜了半天,在官网都没有找到靠谱的关于Pak打包与加载使用的介绍。

    目前我已经完成了Pak的打包部分,通过Launcher来抓命令行,Cook资源文件,以及找到Cook文件目录还有创建pak file list这些基本都很清楚了。

    但是目前一直卡在加载这一部分,这边我现在有两个问题:

    1. VS工程没有办法启动Shipping配置或者Development配置,总是提示GlobalShaderCache-PC3D_SM5.bin Missing,cook for windows我也点了,实在是不知道哪里出的问题

    2.目前我是尝试直接在编辑器中加载Pak,通过VS调试定位问题,看前面几位回答的仁兄好像也是可以成功加载的。目前我把MountPoint设置为工程Content目录的绝对路径是可以成功的将pak中的文件挂载到UFS中,但是我这边加载走到Linker的SerializePackageFileSummary时候就提示加载失败了,log提示uasset中的数据格式不对,不知道是不是因为我打包的是cook的资源,editor中需要加载uncook的资源才行?

     


    你好,
    1. 印象中要启动Development的话只要在Development Editor的时候进行cook content for windows就可以了,不过可能会有其他的问题,shipping的我没试过。如果实在有问题,建议你直接进行打包操作然后用vs去attache。
    2. 确实会有Cook相关问题,Pak的加载测试直接用打包版测试比较好,你可以先在打包的时候不要勾选pak打包。在零散文件可以加载后再使用UnrealPak对零散的文件进行打包操作,测试起来比较方便。


    老哥 请问怎么异步加载地图呢 经典的 openlevel 会阻塞进程 不胜感激!


    你这么一问我一时还真想不起来……
    记得有类似LoadStreamLevel的函数你可以查查,官方应当有level streaming的文档,建议看看


    大佬好,问一下,4.21版本中,初始化PakPlatformFile,FPakPlatformFile* PakPlatformFile = new FPakPlatformFile();这句代码会报Link2019,Link2001的错误,怎么解决这个问题呢?


    应该是Module没有包含PakFile造成的吧,你在配置包含下就可以了


    解决了,谢谢大佬

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">