Translations: English
クリックの検出
マウス、画面タップ、VRコントローラのすべてのアクションに対して、
共通の処理で実装することができます。
const box = new THREE.Mesh(...);
// clickイベントの受信
box.onSelectDown = () => {
if (box.material.color.getHex() === 0x668cff) {
box.material.setValues({ color: 0xff6347 });
} else {
box.material.setValues({ color: 0x668cff });
}
};
// クリック可能なオブジェクトのリスト
const interactableObjects = [box];
...
const adapter = new VerseThree.DefaultEnvAdapter(
renderer,
scene,
camera,
cameraContainer,
player,
() => collisionBoxes,
() => collisionObjects,
() => teleportTargetObjects,
{
getInteractableObjects: () => interactableObjects,
// クリックの受信
onSelectDown: (el, point) => {
if (el.onSelectDown) {
// クリックを対象のオブジェクトへ伝搬する
el.onSelectDown(point);
}
},
}
);
...
document.addEventListener("DOMContentLoaded", () => {
const scene = document.querySelector("a-scene");
// clickイベントの受信
scene.addEventListener("click", (e) => {
const el = e.detail?.intersectedEl;
if (el?.classList?.contains("box")) {
if (el.getAttribute("color") === "#668CFF") {
el.setAttribute("color", "#FF6347");
} else {
el.setAttribute("color", "#668CFF");
}
}
});
});
...
let collisionObjects:THREE.Object3D[] = [];
let teleportTargetObjects:THREE.Object3D[] = [];
let interactableObjects:THREE.Object3D[] = [];
let collisionBoxes:THREE.Box3[] = [];
const queryObjects = (q) => [...scene.querySelectorAll(q)].map((v) => v.object3D).filter((v) => v.visible);
const updateCollisionObjects = () => {
collisionObjects = queryObjects(".collider,.wall");
teleportTargetObjects = queryObjects(".ground,.environmentGround");
// クリック可能なオブジェクトのリスト
interactableObjects = queryObjects(".clickable");
updateCollisionBoxes();
};
...
const adapter = new VerseThree.AFrameEnvAdapter(
scene,
document.getElementById("headOffset").object3D,
document.getElementById("player").object3D,
() => collisionBoxes,
() => collisionObjects,
() => teleportTargetObjects,
{
getInteractableObjects: () => interactableObjects,
// クリックイベントの受信
onSelectDown: (o, _point) => {
if (!o.el || !o.el.classList.contains("clickable")) {
return;
}
// A-FRAMEのclickイベントを発行
o.el.emit("click", {
intersectedEl: o.el,
});
},
}
...