diff --git a/packages/core/src/physics/CharacterController.ts b/packages/core/src/physics/CharacterController.ts index c1fa67fe31..51e7f39d68 100644 --- a/packages/core/src/physics/CharacterController.ts +++ b/packages/core/src/physics/CharacterController.ts @@ -97,6 +97,7 @@ export class CharacterController extends Collider { throw "only allow single shape on controller!"; } super.addShape(shape); + this._updateFlag.flag = true; } /** @@ -116,11 +117,12 @@ export class CharacterController extends Collider { _onUpdate() { if (this._updateFlag.flag) { const { transform } = this.entity; + const shapes = this.shapes; (this._nativeCollider).setWorldPosition(transform.worldPosition); const worldScale = transform.lossyWorldScale; - for (let i = 0, n = this.shapes.length; i < n; i++) { - this.shapes[i]._nativeShape.setWorldScale(worldScale); + for (let i = 0, n = shapes.length; i < n; i++) { + shapes[i]._nativeShape.setWorldScale(worldScale); } this._updateFlag.flag = false; } diff --git a/packages/design/src/physics/ICharacterController.ts b/packages/design/src/physics/ICharacterController.ts index 4f57c199c6..5c3fd18e5d 100644 --- a/packages/design/src/physics/ICharacterController.ts +++ b/packages/design/src/physics/ICharacterController.ts @@ -17,7 +17,7 @@ export interface ICharacterController extends ICollider { * Sets controller's world position. * @param position The new (center) position for the controller. */ - setWorldPosition(position: Vector3): boolean; + setWorldPosition(position: Vector3): void; /** * Retrieve the world position of the controller. diff --git a/packages/physics-physx/src/PhysXCharacterController.ts b/packages/physics-physx/src/PhysXCharacterController.ts index cb2d90a5fa..4e027b67ee 100644 --- a/packages/physics-physx/src/PhysXCharacterController.ts +++ b/packages/physics-physx/src/PhysXCharacterController.ts @@ -28,8 +28,8 @@ export class PhysXCharacterController implements ICharacterController { /** * {@inheritDoc ICharacterController.setWorldPosition } */ - setWorldPosition(position: Vector3): boolean { - return this._pxController.setPosition(position); + setWorldPosition(position: Vector3): void { + this._pxController && this._pxController.setPosition(position); } /** @@ -114,13 +114,16 @@ export class PhysXCharacterController implements ICharacterController { desc.setMaterial(shape._pxMaterials[0]); this._pxController = pxManager._getControllerManager().createController(desc); + this._pxController.setQueryFilterData(new PhysXPhysics._physX.PxFilterData(shape._id, 0, 0, 0)); } /** * @internal */ _destroyPXController(): void { - this._pxController.release(); - this._pxController = null; + if (this._pxController) { + this._pxController.release(); + this._pxController = null; + } } } diff --git a/packages/physics-physx/src/PhysXPhysicsManager.ts b/packages/physics-physx/src/PhysXPhysicsManager.ts index 92c17163d5..8ef2bb24df 100644 --- a/packages/physics-physx/src/PhysXPhysicsManager.ts +++ b/packages/physics-physx/src/PhysXPhysicsManager.ts @@ -191,6 +191,7 @@ export class PhysXPhysicsManager implements IPhysicsManager { hit?: (shapeUniqueID: number, distance: number, position: Vector3, normal: Vector3) => void ): boolean { const { _pxRaycastHit: pxHitResult } = PhysXPhysicsManager; + distance = Math.min(distance, 3.4e38); // float32 max value limit in physx raycast. const result = this._pxScene.raycastSingle( ray.origin, diff --git a/packages/physics-physx/src/shape/PhysXColliderShape.ts b/packages/physics-physx/src/shape/PhysXColliderShape.ts index 06a24765c9..fb7a2135e3 100644 --- a/packages/physics-physx/src/shape/PhysXColliderShape.ts +++ b/packages/physics-physx/src/shape/PhysXColliderShape.ts @@ -128,7 +128,7 @@ export abstract class PhysXColliderShape implements IColliderShape { this._pxShape = PhysXPhysics._pxPhysics.createShape( this._pxGeometry, material._pxMaterial, - false, + true, new PhysXPhysics._physX.PxShapeFlags(this._shapeFlags) ); this._pxShape.setQueryFilterData(new PhysXPhysics._physX.PxFilterData(id, 0, 0, 0));