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

UE4 Python批量修改材质实例的父材质

[复制链接]
发表于 2022-9-15 09:35 | 显示全部楼层 |阅读模式
在游戏开发中存在材质迭代的情况,可能是由于渲染管线的升级,或者说是基础材质的更新。如果要对大量的美术资产进行父材质替换的话,人工操作的工作量是相当大的,因此开发了一个批量修改父材质的工具,这里主要讲解一下核心的实现思路。



材质实例的父材质

值得注意的是,只有材质实例才存在父材质,同时,材质实例的父材质也可以是材质实例;所以在获取用于迭代的材质时,目标类型可以是 "Material" 也可以是 "MaterialInstanceConstant"。
核心函数:unreal.MaterialEditingLibrary.set_material_instance_parent



设置材质实例父材质函数签名

这里需要设置的instance需为Material Instance Constant类型(具体定义参见Instanced Materials | Unreal Engine 4.27 Documentation),新的parent类型为Material Interface,是UMaterial和UMaterialInstance的基类(值得注意的是,在Python中,并没有类似于U、A、F等的前缀),因此我们获取的材质或者材质实例,都可以作为参数。保险起见的话,可以将材质或者材质实例转换为Material Interface类型。
EditAssetLib = unreal.EditorAssetLibrary()#获取操作函数库
_MIData = EditAssetLib.find_asset_data(MIPath)#通过材质资产路径找到asset_data
_MatInstance = unreal.MaterialInterface.cast(_MIData.get_asset())#将材质转换为material interface类型在获取了被替换的材质实例和用于迭代的材质后,就可以进行替换了,具体代码如下:
EditAssetLib = unreal.EditorAssetLibrary()
EditMaterialLib = unreal.MaterialEditingLibrary()
#MIPath = i.material_interface.get_path_name() 这里的材质路径是从骨骼网格体上获取的,i的类型为unreal.SkeletalMaterial
_MIData = EditAssetLib.find_asset_data(MIPath)
_MatInstance = unreal.MaterialInterface.cast(_MIData.get_asset())
EditMaterialLib.set_material_instance_parent(_MatInstance, self.targetMaterial)
EditAssetLib.save_asset(MIPath, False)这里用到了save_asset函数,并且让其不管是否检测到修改都对资产进行保存(设置第二个参数为False)
因为如果不这样做的话,在UE4.27版本中使用set_material_instance_parent函数后引擎的资源管理器检测不到资产修改,如果再次打开引擎就会发现修改没有生效,这个比较恶心人,当初卡了我几个小时,特此分享一下。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-2-22 23:58 , Processed in 0.089966 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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