diff --git a/src/components/character-controller.js b/src/components/character-controller.js index 2b86ff0a353b406d073238c8aca664197ff7084d..7b2145a4a65341dac2b1f9cb93d928a339650a72 100644 --- a/src/components/character-controller.js +++ b/src/components/character-controller.js @@ -75,7 +75,9 @@ AFRAME.registerComponent("character-controller", { }, handleTeleport: function(event) { - this.setPositionOnNavMesh(event.detail.oldPosition, event.detail.newPosition, this.el.object3D, true); + const position = event.detail.newPosition; + const navPosition = event.detail.hitPoint; + this.resetPositionOnNavMesh(position, navPosition, this.el.object3D); }, tick: (function() { @@ -147,21 +149,26 @@ AFRAME.registerComponent("character-controller", { }; })(), - setPositionOnNavMesh: function(startPosition, endPosition, object3D, resetPosition = false) { + setPositionOnNavMesh: function(startPosition, endPosition, object3D) { const nav = this.el.sceneEl.systems.nav; if (nav.navMesh) { - if (!this.navGroup || resetPosition) { + if (!this.navGroup) { this.navGroup = nav.getGroup(endPosition); } - - if (!this.navNode || resetPosition) { - this.navNode = nav.getNode(endPosition, this.navGroup) || this.navNode; - } - + this.navNode = this.navNode || nav.getNode(endPosition, this.navGroup); this.navNode = nav.clampStep(startPosition, endPosition, this.navGroup, this.navNode, object3D.position); } }, + resetPositionOnNavMesh: function(position, navPosition, object3D) { + const nav = this.el.sceneEl.systems.nav; + if (nav.navMesh) { + this.navGroup = nav.getGroup(position); + this.navNode = nav.getNode(navPosition, this.navGroup) || this.navNode; + this.navNode = nav.clampStep(position, position, this.navGroup, this.navNode, object3D.position); + } + }, + updateVelocity: function(dt) { const data = this.data; const velocity = this.velocity;