character movement at +/- 90° not working as expected

Hi,

I have a problem with transform.transformDirection with regards to character movement and movement speed.

I use the following code snippet to calculate velocitychange and then I alter the characters velocity with AddForce.

 `Vector3 relativeVelocity = transform.TransformDirection (InputVector);
	if (InputVector.z > 0) {
		if (InputVector.x != 0) {
			relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunForwardStrafeSpeed :WalkForwardStrafeSpeed;
			relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunForwardStrafeSpeed :WalkForwardStrafeSpeed;
		} else {
			relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunForwardSpeed :WalkForwardSpeed;
		}
	} else if (InputVector.z < 0) {
		if (InputVector.x != 0) {
			relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunBackStrafeSpeed : WalkBackStrafeSpeed;
			relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunBackStrafeSpeed : WalkBackStrafeSpeed;
		} else {
relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunBackSpeed : WalkBackSpeed;
		}
	} else {
		relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunStrafeSpeed : WalkStrafeSpeed;
	}
	//print (relativeVelocity);
	Vector3 currentVelocity = rb.velocity - groundVelocity;
	Vector3 velocityChange = relativeVelocity - currentVelocity;
	//print ("cr"+velocityChange+"=rv"+relativeVelocity+"-rb"+rb.velocity+"-"+groundVelocity);
	velocityChange.x = Mathf.Clamp (velocityChange.x, -MaxVelocityChange, +MaxVelocityChange);
	velocityChange.y = 0;
	velocityChange.z = Mathf.Clamp (velocityChange.z, -MaxVelocityChange, +MaxVelocityChange);
	return velocityChange;`

The code seems flawless, but pure W, A, S or D movements at +/-90° makes the character crawl at a speed of 0.1f instead of 8f. Diagonal movement at +/-90° works perfectly, and all movement works perfectly at +/- 180°.
If rotating the character to +/- 45° or +/-135° and moving with pure W, A, S or D, then the speed towards +/- 180° is faster than the speed towards +/-90°.

Any help or suggestions would be appreciated.

OK, the code was not as flawless as I thought.

I didn’t notice that the relativeVelocity’s x and z axis gradually swap when rotating the character.

I altered the following snippet, of the above code, to: ()

 if (InputVector.z > 0) {
		if (InputVector.x != 0) {
			relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunForwardStrafeSpeed : WalkForwardStrafeSpeed;
			relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunForwardStrafeSpeed : WalkForwardStrafeSpeed;
		} else {
			relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunForwardSpeed : WalkForwardSpeed;
			(edit)relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunForwardSpeed : WalkForwardSpeed;(edit)
			print (relativeVelocity);
		}
	} else if (InputVector.z < 0) {
		if (InputVector.x != 0) {
			relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunBackStrafeSpeed : WalkBackStrafeSpeed;
			relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunBackStrafeSpeed : WalkBackStrafeSpeed;
		} else {
			relativeVelocity.z *= (Input.GetButton ("Sprint")) ? RunBackSpeed : WalkBackSpeed;
			(edit)relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunBackSpeed : WalkBackSpeed;(edit)
		}
	} else {
		relativeVelocity.x *= (Input.GetButton ("Sprint")) ? RunStrafeSpeed : WalkStrafeSpeed;
		(edit)relativeVelocity.y *= (Input.GetButton ("Sprint")) ? RunStrafeSpeed : WalkStrafeSpeed;(edit)
	}