2D movement with gravity shifting
I want to make a 2D action-platformer that utilizes gravity shifting as its main game mechanic; the idea is to be able to make any of the cardinal directions "down" and have the player be able to move like a normal platformer relative to the current gravity direction. I already have the gravity shifting down, but I keep running into issues with the player movement and camera. For north and south, the movement works perfectly fine but the camera isn't turning smoothly like the player when shifting gravity; and for east and west, the player moves in the right directions but rotates along the global y-axis instead of its local y-axis, and the camera stays upright instead of rotating.
I'm sure that the mistake(s) I'm making is/are small and easily fixed, but I keep coming up with 'solutions' that just cause other problems
float lLx = Input.GetAxis("LStickX");
float lLy = Input.GetAxis("LStickY");
if (lLx != 0)
{
if (lLx < 0)
{
mTargetTurnAngle = 90f;
}
else
{
mTargetTurnAngle = -90f;
}
transform.position += mMovementVector * (lLx * mMovementSpeed);
//mRb.AddForce(transform.right * (lLx * mMovementSpeed), ForceMode.Force);
transform.position = new Vector3(transform.position.x, transform.position.y, 0);
}
switch ((int)mCurGravity)
{
case 0: //South (normal gravity)
mGravNormal = Vector3.down;
mMovementVector = Vector3.right;
mTargetShiftAngle = 0f;
break;
case 1: //West
mGravNormal = Vector3.left;
mMovementVector = Vector3.down;
mTargetShiftAngle = -90f;
break;
case 2: //North
mGravNormal = Vector3.up;
mMovementVector = Vector3.left;
mTargetShiftAngle = 180f;
break;
case 3: //East
mGravNormal = Vector3.right;
mMovementVector = Vector3.up;
mTargetShiftAngle = 90f;
break;
default:
break;
}
mRb.AddForce(mGravityFactor * mRb.mass * mGravNormal);
if (mTargetShiftAngle != transform.rotation.eulerAngles.z || transform.rotation.eulerAngles.y != mTargetTurnAngle)
{
mTargetRotation = Quaternion.Euler(mTargetShiftAngle, mTargetTurnAngle, 0);
transform.rotation = Quaternion.RotateTowards(transform.rotation, mTargetRotation, mShiftRotatationSpeed);
Vector3 temp = transform.rotation.eulerAngles;
mCamera.transform.rotation = Quaternion.Euler(0, 0, temp.z);
//mCamera.transform.rotation = Quaternion.Euler(0, 0, temp.x);
}
mCamera.transform.position = new Vector3(transform.position.x, transform.position.y, -10);
.
.
.
if (Input.GetButtonDown("AButton"))
{
if (IsGrounded())
{
//mRb.AddForce(mJumpforce * transform.up, ForceMode.Impulse); //original
mRb.AddForce(mJumpforce * (-mGravNormal), ForceMode.Impulse);
}
}
How can I get my player and camera to behave like a normal 2D platformer with any gravity?