自定义 JavaScript 组件

我们继续从入门中停止的地方开始。

概述 

本教程的目标是让您熟悉如何在项目中添加自定义逻辑。

我们将创建两个脚本,用于计算一个对象被看到的帧数。

一个脚本将添加到相机上,通过光线投射来检查我们是否正在查看特定对象。另一个脚本则添加到对象上以显示帧计数。

JavaScript 热重载 

为了让我们的工作流程尽可能顺畅,编辑器会自动监视 JavaScript 文件的更改,并在保存时解析它们。

如果您在浏览器中运行应用程序,它甚至会自动重新加载页面以应用更改后的内容。

创建 JavaScript 组件 

右键点击“资源浏览器”中的空白区域,添加一个新的 JavaScript 组件。

截图: 入门 JS - 添加组件

将组件命名为 counting-gaze.js

通过双击该文件,它将使用您系统中配置的用于打开 .js 文件的默认应用程序打开。

代码 

最后,我们为组件注入生命。以下代码每帧向场景中发送一次光线投射:

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

export class CountingGaze extends Component {
    static TypeName = 'counting-gaze';

    origin = [0, 0, 0];
    dir = [0, 0, 0];

    init() {
        console.log('Counting gaze initialized');
    }

    update() {
        /* 获取该对象的位移,并存储在 "origin" 中 */
        this.object.getPositionWorld(this.origin);
        /* 获取该对象的方向,并存储在 "dir" 中 */
        this.object.getForwardWorld(this.dir);

        /* 向场景发送光线,并查看是否命中碰撞组 "1" 或 "2" 中的对象 */
        const rayHit = this.engine.scene.rayCast(
            this.origin, this.dir, (1 << 1) | (1 << 2));
        if(rayHit.hitCount > 0) {
            for(let i = 0; i < rayHit.hitCount; ++i) {
                let o = rayHit.objects[i];

                // TODO: 我们将在此处对命中的对象进行计数!
                console.log('Raycast hit object:', o.name);
            }
        }
    }
}

目前我们仅打印我们通过光线投射命中的对象的名称。

将组件添加到对象 

此组件不会自动运行。我们需要将其附加到相机上!

截图: 入门 JS - 添加自定义组件

运行 

要查看组件的效果,“打包”并“打开浏览器”。

如果您在浏览器中使用 Ctrl + Shift + C 打开 JavaScript 控制台,您会注意到组件已初始化。

截图: 入门 JS - 控制台中组件初始化

没有对象名称被打印。这是因为 this.engine.scene.rayCast() 使用了碰撞系统,该系统仅在具有 collider 组件时工作。为确保光线投射命中目标,我们需要添加更多组件!

碰撞 

为邮箱对象添加一个子对象,如下截图所示。 为新的子对象添加一个 collision 组件。

将半径设置为,例如,0.15

截图: 入门 JS - 碰撞体

通过此设置,我们可以“打包”并看到光线投射起作用。

计数和显示 

我们需要跟踪计数,并最终使用文本组件来显示它。

为“Collider”对象添加一个“text”组件,并将文本更改为“0”。

然后添加一个名为 gaze-counter.js 的新 JavaScript 源文件。

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

export class GazeCounter extends Component {
    static TypeName = 'gaze-counter';
    static Properties = {
        msg: Property.string('i')
    };

    count = 0;

    init() {
        console.log('Gaze counter initialized');
    }

    start() {
        this.textComp = this.object.getComponent('text');
    }

    update() {
        this.textComp.text = `${this.msg} ${this.count}`;
    }
}

您会注意到这里的 msg 属性。编辑器将在我们将组件添加到“Collider”对象时自动生成一个输入框:

截图: 入门 JS - 组件参数

最后,将 counting-gaze.js 中的 // TODO 注释替换为以下内容:

    const counterComp = o.getComponent('gaze-counter');
    if(counterComp) {
        counterComp.count++;
    }

结果 

“打包”并检查浏览器。您现在将看到最终结果!

截图: 入门 JS - 结果

总结 

Wonderland Engine 允许您使用在浏览器中运行的任何 JavaScript 库。

通过自动重载,工作流程能够实现快速迭代。

在此处查找 Wonderland Engine JavaScript API 参考众多简短教程