在运行时更改材质属性

您也可以在运行时更改在编辑器中找到的任何材质属性。这可能是切换纹理用于翻页书、为突出显示对象以指示交互性,或只是基于天气动画化高光。

在 Wonderland Engine 中,您可以通过Object3D.getComponent来获取网格组件使用的材质,或者在您的自定义组件中指定一个类型为Property.material()的参数。

更改材质属性 

更改材质属性是通过Material类型上的生成的setter/getter完成的。

material.setDiffuseColor([1, 1, 0, 1]); /* R, G, B, A */
material.setSpecularity(2);
material.setDiffuseTexture(someTexture);

任何可以从材质属性面板中设置的属性,都可以在这里设置。

示例:淡入组件 

下面的示例根据时间对材质的 alpha 值进行动画处理。这可以用作对象的淡入效果。

注意,使用网格组件上设置的材质的每个对象都将受到动画的影响。为了使动画对对象唯一,组件使用Material.clone来获取唯一实例并将其设置到网格。

import {Component, Property} from '@wonderlandengine/api';

export class FadeIn extends Component {
    static TypeName = 'fade-in';
    static Properties = {
        /* 淡入持续时间(秒) */
        duration: Property.float(2.0),
        /* 起始 alpha 值 */
        startAlpha: Property.float(2.0),
        /* 最终 alpha 值 */
        endAlpha: Property.float(2.0),
    };

    start() {
        /* 从附加到此对象的网格组件中获取材质 */
        const mesh = this.object.getComponent('mesh');
        if (!mesh) throw new Error('对象上缺少网格组件。');
        /* 确保我们不意外更改使用相同材质的其他对象 */
        this.material = mesh.material.clone();
        mesh.material = this.material;
    }

    onActivate() {
        this.alpha = 1.0;
        this.time = 0;
    }

    update(dt) {
        this.time += dt;

        this.alpha =
            this.startAlpha +
            (this.endAlpha - this.startAlpha) * Math.min(1.0, this.time / this.duration);
        /* 在达到endAlpha后无需调用update() */
        if (this.alpha == this.endAlpha) this.active = false;

        /* 设置漫反射颜色的 alpha。对于其他材质,您可能需要修改
         * 不同的属性 */
        const c = this.material.getDiffuseColor();
        this.material.setDiffuseColor([c[0], c[1], c[2], this.alpha]);
    }
}

请注意,像diffuseColor这样的材质属性取决于使用的流水线和着色器。例如,您可能希望为“Flat Opaque”而修改flatColor,或者为自定义着色器完全不同的属性。

材质属性面板中显示的任何属性都可以通过这种方式编辑。