예제 #1
0
    void DoubleJump_SuperUpdate()
    {
        Vector3 planarMoveDirection   = Math3d.ProjectVectorOnPlane(controller.up, moveDirection);
        Vector3 verticalMoveDirection = moveDirection - planarMoveDirection;

        planarMoveDirection = Vector3.MoveTowards(planarMoveDirection, LocalMovement() * WalkSpeed, JumpAcceleration * JumpControl * controller.deltaTime);

        if (Vector3.Angle(verticalMoveDirection, controller.up) > 90 && AcquiringGround())
        {
            moveDirection = planarMoveDirection;
            currentState  = PlayerStates.Idle;
            return;
        }

        collisionVector = controller.IsOnTheWall(LocalMovement());
        if (collisionVector != Vector3.zero)
        {
            currentState = PlayerStates.WallSlide;
            return;
        }

        foreach (var c in controller.collisionData)
        {
            if (c.normal == -controller.up)
            {
                verticalMoveDirection.y = 0;
                break;
            }
        }

        if (moveDirection.y == 0)
        {
            currentState = PlayerStates.Fall;
            return;
        }

        if (IsOnEdge())
        {
            currentState = PlayerStates.Climb;
            return;
        }

        verticalMoveDirection -= controller.up * Gravity * controller.deltaTime;
        moveDirection          = planarMoveDirection + verticalMoveDirection;
    }