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的值
就像这样:
然而,在打开NewMaterialFunction1_Inst_True和NewMaterialFunction1_Inst_False的时候,编辑器崩溃了
解决方式
通过debug发现是在MaterialEditorUtilities.cpp
的FMaterialEditorUtilities::GetStaticSwitchExpressionValue中,在判断InputExpression的InputType是FunctionInput_StaticBool
的时候会进行一些处理,但是此时的FunctionStack里面的指针本来在前面塞进来的时候就是nullptr,这里简直百分百是空指针,check(TopmostFunctionState->FunctionCall);一定会崩掉的,那就把这里跳过就好了(???
在UDN老哥的帮助下确认确实是bug,并且官方已经于2021年7月份在UE5中修复,具体的release分支如下
具体的修改也很直接……判断一下是不是空指针……空指针不处理……