1234567891011121314151617181920212223242526272829303132333435363738 |
- import * as RE from 'rogue-engine'
- import * as THREE from 'three'
- export default class FloorCheckComponent extends RE.Component {
- raycaster: THREE.Raycaster
- down = new THREE.Vector3(0, -1, 0)
- @RE.props.num() near: number = 0
- @RE.props.num() far: number = Infinity
- isOnFloor: boolean = false
- @RE.props.num() touchingFloorDistance: number = 1
- childrenToFilter
- awake() {
- this.raycaster = new THREE.Raycaster(this.object3d.position, this.down, this.near, this.far)
- this.childrenToFilter = this.getAllChildrenUuids(this.object3d)
- }
- getAllChildrenUuids(child) {
- return child.children.flatMap(innerChild => {if(innerChild.children.length > 0) {return this.getAllChildrenUuids(innerChild)} return innerChild.uuid})
- }
- start() {
- }
- update() {
- this.raycaster.set(this.object3d.position, this.down)
- this.isOnFloor = false
- let intersects = this.raycaster.intersectObjects(RE.App.currentScene.children)
- const notMeIntersects = intersects.filter((intersect) => {
- return !this.childrenToFilter.includes(intersect.object.uuid)
- })
- notMeIntersects.forEach(intersect => {
- this.isOnFloor = this.isOnFloor || intersect.distance <= this.touchingFloorDistance
- })
- }
- }
- RE.registerComponent(FloorCheckComponent);
|