如果没有传递数据,aframe 实体如何默认为模式实体

How does an aframe entity defaults to the schema ones if no data is passed on

我在理解 aFrame 中实体如何与模式和数据一起工作时遇到了一些困难。原谅我,我是图书馆的新手,也许我遗漏了一些东西。谢谢

考虑以下几点:

// register the aframe component (Button.js):

import { registerComponent, THREE } from 'aframe'

const button = registerComponent('button', {
  schema: {
    width: { type: 'number', default: 0.6 },
    height: { type: 'number', default: 0.40 },
    color: { type: 'string', default: 'orange' },
  },
  init: function() {
    const schema = this.schema // Schema property values.
    const data = this.data // Component property values.
    const el = this.el // Reference to the component's entity.

    // Create geometry.
    this.geometry = new THREE.BoxBufferGeometry(data.width || schema.width.default, data.height || schema.height.default, data.depth || schema.depth.default)

    // Create material.
    this.material = new THREE.MeshStandardMaterial({ color: data.color || schema.color.default })

    // Create mesh.
    this.mesh  = new THREE.Mesh(this.geometry, this.material)

    // Set mesh on entity.
    el.setObject3D('mesh', this.mesh)
  }
})

export default button

// add the entity in the app (App.js)
import button from './Button'

<a-entity button="width: 0.4; height: 0.4: color: 'green'" position="0 0 0"></a-entity>

现在,对于上面的示例,我希望我的组件将使用数据而不是模式默认值。如果我只想做:

<a-entity button position="0 0 0"></a-entity>

它将使用架构默认的。 这是应该做的吗? 我见过很多人们只使用数据的例子。 谢谢

schema 不适合直接使用。来自 docs:

The schema defines the properties of its component. (...) The component’s property type values are available through this.data

想法是这样的:

  • 您在架构中定义属性(具有默认值)

    schema {
      prop: {default: "default value"}
    },
    
  • 您使用 this.data[prop_name] 访问值:

    init: function() {
      console.log("prop value at init:", this.data.prop)
    },
    
  • 您可以监控 属性 更新(例如通过 update 处理程序中的 setAttribute("propname", "newValue")

    update: function(oldData) {
         console.log("prop changed from", oldData.prop, "to", this.data.prop)
    },
    

在这样的设置中:

<!-- this.data.prop will contain the default values -->
<a-entity foo></a-entity>

<!-- this.data.prop will contain the new value -->
<a-entity foo="prop: value></a-entity>