So im trying to fix my character moving faster on the diagonals and it is still not working and i dont know what i am doing wrong. My character moves also moves slower when going backwards also going sideways. This is what i have tried:
float axisX = joystickInput.axis.x;
float axisY = joystickInput.axis.y;
// Speed and axis
if (axisY < 0) { speed = Mathf.Abs(-axisY) * backSpeed; } // Speed on the negative y-axis
else { speed = Mathf.Abs(axisY) * forwardSpeed; } // Speed on the y-axis
speed += Mathf.Abs(axisX) * sideSpeed; // Speed on the x-axis
// Direction of the VR headset
Vector3 direction = Player.instance.hmdTransform.TransformDirection(new Vector3(axisX, 0, axisY));
// Fixes faster movement on diagonals
Vector3 clamp = Vector3.ClampMagnitude(direction, speed);
//Apply
CharController.Move(Vector3.ProjectOnPlane(clamp, Vector3.up) * speed * Time.deltaTime);
I like to work visually so I would recommend an AnimationCurve that shows how angle and speed relate. You can tweak this in the Inspector for better results:
// from 0° = forward to 180° = backwards
public AnimationCurve speedByAngle = new AnimationCurve(new Keyframe(0, 1f), new Keyframe(90f, 0.5f), new Keyframe(180, 0.5f));
void MoveController()
{
float axisX = joystickInput.axis.x; // assuming this goes from -1 to 1
float axisY = joystickInput.axis.y; // assuming this goes from -1 to 1
// create a direction vector directly from the input
Vector3 dir = new Vector3(axisX, 0, axisY).normalized;
// now calculate the angle between forward and your move vector
// and use this to get the speed from the animation curve
float speed = speedByAngle.Evaluate(Vector3.Angle(dir, Vector3.forward));
Vector3 global = Player.instance.hmdTransform.TransformDirection(dir);
CharController.Move(global * speed * Time.deltaTime);
}