编写effect报错:error: Cannot read property 'type' of undefined TypeError: Cannot read property 'type' of undefined

这个问题在最新的2.4.12仍旧存在,直接说原因:mtl存在了effect中未定义的property,检查下mtl文件中的porps和effect中的properties

复现步骤

先在effect中定义一个properties

image

然后回到编辑器中编辑绑定了effect的material

image

fire1.mtl中会存储这个值

image

此时我们把effect中刚刚定义的property删掉,回到编辑中就会报错

image

这个错也是让我查了很久才知道是什么意思,通过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;
    }
1赞

我就说有时候莫名的报错了,检查了也没有发现错误
大佬牛逼