这个问题在最新的2.4.12仍旧存在,直接说原因:mtl存在了effect中未定义的property,检查下mtl文件中的porps和effect中的properties
复现步骤
先在effect中定义一个properties
然后回到编辑器中编辑绑定了effect的material
fire1.mtl中会存储这个值
此时我们把effect中刚刚定义的property删掉,回到编辑中就会报错
这个错也是让我查了很久才知道是什么意思,通过debug我发现了是mtl中的props导致的
对应的问题代码:engine\cocos2d\core\assets\material\effect-base.ts
_setPassProperty (name, value, pass, directly) {
let properties = pass._properties;
if (!properties.hasOwnProperty(name)) { // 这里会检查effect中是否有对应的property
this._createPassProp(name, pass);// 没有就创建一个,很遗憾,同样会做上边的检查,导致无法创建成功
}
let prop = properties[name]; // 这里取出来是undefined
let compareValue = value;
if (prop.type === enums.PARAM_TEXTURE_2D) { // 报错发生在这里
compareValue = value && value.getImpl();
}
if (prop.value === compareValue) {
return true;
}
this._dirty = true;
return Pass.prototype.setProperty.call(pass, name, value, directly);
}
_createPassProp (name, pass) {
let prop = pass._properties[name]; // 同样还是在检查effect中是否存在对应的property,
if (!prop) {
return; // 这里真没有,就直接返回出去了,导致了后续的问题
}
let uniform = Object.create(null);
uniform.name = name;
uniform.type = prop.type;
if (prop.value instanceof Float32Array) {
uniform.value = new Float32Array(prop.value);
}
else if (prop.value instanceof Float64Array) {
uniform.value = new Float64Array(prop.value);
}
else {
uniform.value = prop.value;
}
pass._properties[name] = uniform;
return uniform;
}