public static bool Raycast(WTPhysicsRay ray, out WTPhysicsRaycastHit raycastHit, float distance) { raycastHit = new WTPhysicsRaycastHit(); return(Physics.Raycast(ray.ray, out raycastHit.raycastHit, distance * FPhysics.POINTS_TO_METERS)); }
virtual public void UpdateMovement() { int layerMask = 1 << LayerMask.NameToLayer("Environment"); WTPhysicsRay lLowRay = new WTPhysicsRay(this, new Vector2(0, 0), Vector3.left); WTPhysicsRay lHighRay = new WTPhysicsRay(this, new Vector2(0, 1), Vector3.left); WTPhysicsRay rLowRay = new WTPhysicsRay(this, new Vector2(1, 0), Vector3.right); WTPhysicsRay rHighRay = new WTPhysicsRay(this, new Vector2(1, 1), Vector3.right); WTPhysicsRaycastHit lLowHit; WTPhysicsRaycastHit lHighHit; WTPhysicsRaycastHit rLowHit; WTPhysicsRaycastHit rHighHit; float xRayDistance = Mathf.Abs(velocity.x * Time.deltaTime); // leftwards if (velocity.x < 0) { if (WTPhysicsRay.Raycast(lLowRay, out lLowHit, xRayDistance, layerMask)) { if (lLowHit.GetPhysicsNode().CompareTag("Solid")) { if (shouldBounce && Mathf.Abs(velocity.x * Time.deltaTime) > WTConfig.minBounceDist) { velocity.x *= -WTConfig.bounceConstant; } else { velocity.x = 0; } this.x = lLowHit.GetPoint().x + physicsComponent.GetGlobalHitBox().width / 2f + 0.01f; } } else if (WTPhysicsRay.Raycast(lHighRay, out lHighHit, xRayDistance, layerMask)) { if (lHighHit.GetPhysicsNode().CompareTag("Solid")) { if (shouldBounce && Mathf.Abs(velocity.x * Time.deltaTime) > WTConfig.minBounceDist) { velocity.x *= -WTConfig.bounceConstant; } else { velocity.x = 0; } this.x = lHighHit.GetPoint().x + physicsComponent.GetGlobalHitBox().width / 2f + 0.01f; } } } // rightwards else if (velocity.x > 0) { if (WTPhysicsRay.Raycast(rLowRay, out rLowHit, xRayDistance, layerMask)) { if (rLowHit.GetPhysicsNode().CompareTag("Solid")) { if (shouldBounce && Mathf.Abs(velocity.x * Time.deltaTime) > WTConfig.minBounceDist) { velocity.x *= -WTConfig.bounceConstant; } else { velocity.x = 0; } this.x = rLowHit.GetPoint().x - physicsComponent.GetGlobalHitBox().width / 2f - 0.01f; } } else if (WTPhysicsRay.Raycast(rHighRay, out rHighHit, xRayDistance, layerMask)) { if (rHighHit.GetPhysicsNode().CompareTag("Solid")) { if (shouldBounce && Mathf.Abs(velocity.x * Time.deltaTime) > WTConfig.minBounceDist) { velocity.x *= -WTConfig.bounceConstant; } else { velocity.x = 0; } this.x = rHighHit.GetPoint().x - physicsComponent.GetGlobalHitBox().width / 2f - 0.01f; } } } if (!isConstantlyMoving) { float frictionMultiplier = this.isOnGround?WTConfig.frictionConstant:1; float dragAmt = drag.x * frictionMultiplier * Time.deltaTime; if (velocity.x - dragAmt > 0) { velocity.x -= dragAmt; } else if (velocity.x + dragAmt < 0) { velocity.x += dragAmt; } else { velocity.x = 0; } } this.x += velocity.x * Time.deltaTime; WTPhysicsRay lCeilingRay = new WTPhysicsRay(this, new Vector2(0, 1), Vector3.up); WTPhysicsRay rCeilingRay = new WTPhysicsRay(this, new Vector2(1, 1), Vector3.up); WTPhysicsRay lFloorRay = new WTPhysicsRay(this, new Vector2(0, 0), Vector3.down); WTPhysicsRay rFloorRay = new WTPhysicsRay(this, new Vector2(1, 0), Vector3.down); WTPhysicsRaycastHit lFloorHit; WTPhysicsRaycastHit rFloorHit; WTPhysicsRaycastHit lCeilingHit; WTPhysicsRaycastHit rCeilingHit; velocity.y += WTConfig.gravity * Time.deltaTime; float yRayDistance = Mathf.Abs(velocity.y * Time.deltaTime); // downwards if (velocity.y < 0) { if (WTPhysicsRay.Raycast(lFloorRay, out lFloorHit, yRayDistance, layerMask)) { if (lFloorHit.GetPhysicsNode().CompareTag("Solid")) { if (velocity.y <= 0) { if (shouldBounce && Mathf.Abs(velocity.y * Time.deltaTime) > WTConfig.minBounceDist) { velocity.y *= -WTConfig.bounceConstant; } else { velocity.y = 0; this.isOnGround = true; } } this.y = lFloorHit.GetPoint().y + physicsComponent.GetGlobalHitBox().height / 2f + 0.01f; } } else if (WTPhysicsRay.Raycast(rFloorRay, out rFloorHit, yRayDistance, layerMask)) { if (rFloorHit.GetPhysicsNode().CompareTag("Solid")) { if (velocity.y <= 0) { if (shouldBounce && Mathf.Abs(velocity.y * Time.deltaTime) > WTConfig.minBounceDist) { velocity.y *= -WTConfig.bounceConstant; } else { velocity.y = 0; this.isOnGround = true; } } this.y = rFloorHit.GetPoint().y + physicsComponent.GetGlobalHitBox().height / 2f + 0.01f; } } else { this.isOnGround = false; } } // upwards else if (velocity.y > 0) { if (WTPhysicsRay.Raycast(lCeilingRay, out lCeilingHit, yRayDistance, layerMask)) { if (lCeilingHit.GetPhysicsNode().CompareTag("Solid")) { this.y = lCeilingHit.GetPoint().y - physicsComponent.GetGlobalHitBox().height / 2f - 0.01f; if (shouldBounce) { velocity.y *= -WTConfig.bounceConstant; } else { velocity.y = 0; } } } else if (WTPhysicsRay.Raycast(rCeilingRay, out rCeilingHit, yRayDistance, layerMask)) { if (rCeilingHit.GetPhysicsNode().CompareTag("Solid")) { this.y = rCeilingHit.GetPoint().y - physicsComponent.GetGlobalHitBox().height / 2f - 0.01f; if (shouldBounce) { velocity.y *= -WTConfig.bounceConstant; } else { velocity.y = 0; } } } } if (velocity.y > WTConfig.maxVelocity.y) { velocity.y = WTConfig.maxVelocity.y; } else if (velocity.y < -WTConfig.maxVelocity.y) { velocity.y = -WTConfig.maxVelocity.y; } this.y += velocity.y * Time.deltaTime; }