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,
      });
    },
  }
  ...
 
 
 
 
 
 
 
 
 
 
 
 
 
 












 
 













 
 
 
 
 
 
 
 
 
 
 


完成版のリンク等

Last Updated: