Beispiel #1
0
 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));
 }
Beispiel #2
0
    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;
    }