如何禁用 Aframe 中 a-entity 的 raycaster 单击事件?
How do I disable the raycaster click event on an a-entity in Aframe?
我想在实体被光线投射器点击一次后禁用对它的点击。该实体会打开一个面板,所以我不希望它显示多次
这实际上取决于您是否使用 raycaster="objects: ...;"
。这通常是推荐的方法,因此您的光线投射器不会与场景中的每个实体交互,从而导致性能下降。
这可以通过多种方式完成,但最常见的一种是使用 class 选择器,例如 .clickable
,然后在单击时删除 class。如果不再需要,则删除事件侦听器。
光标光线投射器:
<a-cursor raycaster="objects: .clickable;"></a-cursor>
分量:
AFRAME.registerComponent('click-once', {
init: function () {
var self = this;
var scene = self.el.sceneEl;
var raycaster = scene.querySelector('[cursor]').components.raycaster;
// Define function to be executed on click.
var clickHandler = function (e) {
// Log clicks.
console.log('clicked');
// Remove "clickable" class from entity.
self.el.classList.remove('clickable');
// Refresh raycaster object list to reflect changes.
raycaster.refreshObjects();
// Remove event listener since no longer needed.
self.el.removeEventListener('click', clickHandler);
};
// Add event listener for click.
self.el.addEventListener('click', clickHandler);
}
});
编辑:如果 data-xxxx
属性或组件用作选择器,而不是 classes/ids,这可以进一步简化。例如:data-clickable
默认情况下,A-Frame的raycaster
在实体和attributes/components(非classes)为added/removed时自动刷新,所以不需要使用raycaster.refreshObjects()
在这种情况下。 https://aframe.io/docs/master/components/raycaster.html#properties_autorefresh
HTML:
<a-entity cursor raycaster="objects: [data-clickable];"></a-entity>
JS:
self.el.removeAttribute('data-clickable');
代码演示: https://codepen.io/dansinni/pen/MGKGZq
编辑:如果您使用 <a-cursor>
而不是 <a-entity cursor="..."
,那么您可能需要使用以下 var raycaster
赋值:
var raycaster = scene.querySelector('a-cursor').components.raycaster;
或者,如果您明确附加 raycaster
组件:
var raycaster = scene.querySelector('[raycaster]').components.raycaster;
希望这对您有所帮助。
我想在实体被光线投射器点击一次后禁用对它的点击。该实体会打开一个面板,所以我不希望它显示多次
这实际上取决于您是否使用 raycaster="objects: ...;"
。这通常是推荐的方法,因此您的光线投射器不会与场景中的每个实体交互,从而导致性能下降。
这可以通过多种方式完成,但最常见的一种是使用 class 选择器,例如 .clickable
,然后在单击时删除 class。如果不再需要,则删除事件侦听器。
光标光线投射器:
<a-cursor raycaster="objects: .clickable;"></a-cursor>
分量:
AFRAME.registerComponent('click-once', {
init: function () {
var self = this;
var scene = self.el.sceneEl;
var raycaster = scene.querySelector('[cursor]').components.raycaster;
// Define function to be executed on click.
var clickHandler = function (e) {
// Log clicks.
console.log('clicked');
// Remove "clickable" class from entity.
self.el.classList.remove('clickable');
// Refresh raycaster object list to reflect changes.
raycaster.refreshObjects();
// Remove event listener since no longer needed.
self.el.removeEventListener('click', clickHandler);
};
// Add event listener for click.
self.el.addEventListener('click', clickHandler);
}
});
编辑:如果 data-xxxx
属性或组件用作选择器,而不是 classes/ids,这可以进一步简化。例如:data-clickable
默认情况下,A-Frame的raycaster
在实体和attributes/components(非classes)为added/removed时自动刷新,所以不需要使用raycaster.refreshObjects()
在这种情况下。 https://aframe.io/docs/master/components/raycaster.html#properties_autorefresh
HTML:
<a-entity cursor raycaster="objects: [data-clickable];"></a-entity>
JS:
self.el.removeAttribute('data-clickable');
代码演示: https://codepen.io/dansinni/pen/MGKGZq
编辑:如果您使用 <a-cursor>
而不是 <a-entity cursor="..."
,那么您可能需要使用以下 var raycaster
赋值:
var raycaster = scene.querySelector('a-cursor').components.raycaster;
或者,如果您明确附加 raycaster
组件:
var raycaster = scene.querySelector('[raycaster]').components.raycaster;
希望这对您有所帮助。