原创文章,转载请注明出处。

前言

UE4在打包之后有时候会遇到Material丢失的问题(都是DefuaultMaterial灰色材质),编辑器下运行是正常的,如果你也遇到了,那么可以在这里停留一下看看有没有你想要的答案。

解决方案

1>先确认资源是否被Cook

先确认你的材质是否有被引用,其实这个目的是要确认你的资源是否被Cook,也就是确认其是否被打到了你的Pak里面。
如何确认:
看下面的图片,对应转成你自己项目的Saved/Cooked/…… 目录下,找到你的那个丢失材质的名字,看看里面有没有。
在这里插入图片描述
到这里的话,你应该就能确认是不是没有被Cook了。
如果没有,按照下面的确认一下,如果有的话,就不用看这个标题了。
其实这个引用关系确认,不单适用于材质丢失,其他的任意uasset都有可能没有被cook上。
首先引擎cook资源是下面的原则
1)你要打包的umap里面所有被引用到的资源都统统会被cook,都是静态的在umap里面存好的,比如你在代码里写的动态的Load一个资源,这个时候其实是这个资源打包时候引擎是不知道引用关系的。所以需要按照下面步骤指定一下
2)指定额外要cook的目录,在项目设置Packaging->Additional Asset Directories to Cook路径数组中指定的,在这里添加上之后你的资源就会被Cook到了。
并注意挨着的下面还有一个Directories to never cook(这个路径代表指你不想cook的路径添加到这里),当然你用的的资源确认也不能在这个路径里面出现
在这里插入图片描述
如果是你资源没有被Cook,那么按照上面步骤操作完再打包看看。

2>确认你的材质所处的路径是不是有中文

在4.25引擎版本中,对中文资源支持不友好,像4.26.2就没事。比如UMG上给Image设置一张图片(中文图片或图片处于中文路径中),发现设置不上,英文的就可以。
我只是发现4.25下中文有问题,当然你确认一下你当前使用的引擎版本是不是也存在这样的问题。
如果存在的话,再看你的材质是不是在中文路径里,如果是,那么基本上将其放到英文路径里面问题就好了。

还是最好用英文,一是规范,二是减少出错找问题的时间。

3>材质的Usage守则,确认你的资源是什么类型,再去对应材质的Usage是否匹配

每个UMaterial上都有个Usage的属性数组,这个数据决定了你的材质可以被应用到哪些UE的类型上
(比如是否能应该到Skeletal Mesh骨骼网格/Instanced Static Meshes静态网格实例等等)如下
在这里插入图片描述
原理其实就是你这个材质会应用到哪些UE的类型上,如果你这个材质Usage上面没有选InstanceStaticMesh但是你用到了InstanceStaticMesh上,那么就会出现没有材质的情况。

如果你也是类似情况,不妨打开材质看一下usage这里。
在这里插入图片描述
比如下图的小汽车打包后就是没有材质的,资源也被cook了,也没有中文路径。但是就是材质属性之勾选了Skeletal Mesh,但是我是通过Brush将车刷到场景中的,这个类型其实是AInstancedFoliageActor,其实就是常用的刷植被的功能。最终对应到的是InstanceStaticMesh上,所以我在汽车的每个材质球的Usage中增加了InstanceStaticMesh的选项。再打包效果就对了。
在这里插入图片描述

4>加载外部的Pak没有材质

这片文章中介绍了加载单独的Pak内没有材质的情况

谢谢,创作不易,大侠请留步… 动起可爱的双手,来个关注再走呗
ღ( ´・ᴗ・` )比心<( ̄︶ ̄)>

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐