UE4:MaterialFunctionInstance Editor的一个崩溃问题

问题场景

版本:4.27 release

TA大佬最近在优化材质的时候,会把一些常用的公共的材质内的方法做成一个MaterialFunction,但是其中有些SwitchParameter,于是从MaterialFunction创建MaterialFunctionInstance然后更改不同的SwitchParameter的值,但是在打开材质函数实例的时候编辑器崩掉了

具体的例子是这样的:

如下图,创建一个MaterialFunction,分别有三个颜色节点分别是R,G,B
其中还有一个SwitchParameter和一个StaticSwitch节点
其中Swith节点的Value由一个Input节点传入值

材质函数

我们先将SwitchParameter的值设为false,在一个Material中调用这个Function:

材质函数输入

当Material中的StaticBool为true的时候,此时MaterialFunction中的StaticSwitch也为true,最后输出的是绿色
改为false的时候输出的是蓝色

以上流程都没有问题。

但是,目前情况下这个NewMaterialFunction1中的SwitchParameter的节点值都是false

我们希望有true也有false,所以从NewMaterialFunction1创建了NewMaterialFunction1_Inst_True和NewMaterialFunction1_Inst_False两个MaterialFunctionInstance

然后分别打开和关闭SwitchParameter的值

就像这样:

打开SwitchParameter

关闭SwitchParameter

然而,在打开NewMaterialFunction1_Inst_True和NewMaterialFunction1_Inst_False的时候,编辑器崩溃了

解决方式

通过debug发现是在MaterialEditorUtilities.cppFMaterialEditorUtilities::GetStaticSwitchExpressionValue中,在判断InputExpression的InputType是FunctionInput_StaticBool的时候会进行一些处理,但是此时的FunctionStack里面的指针本来在前面塞进来的时候就是nullptr,这里简直百分百是空指针,check(TopmostFunctionState->FunctionCall);一定会崩掉的,那就把这里跳过就好了(???

在UDN老哥的帮助下确认确实是bug,并且官方已经于2021年7月份在UE5中修复,具体的release分支如下

修复提交记录

具体的修改也很直接……判断一下是不是空指针……空指针不处理……

具体代码链接


UE4:MaterialFunctionInstance Editor的一个崩溃问题
http://muchenhen.com/posts/13087/
作者
木尘痕
发布于
2022年10月24日
许可协议