- Home /
Rotating a Top-Down vehicle To Face a Direction
I'm attempting to write a script to control cars in a top-down 2D game, and I've been having trouble with it not behaving how I want. Essentially the way I want it to control is the player uses the thumbstick to specify or "point out" the direction they want the car to face, and the script rotates the car towards that based on a maximum turn per frame radius. However, in the game the cars always take the longest possible way to get to the destination the player sets but only in a certain range (When the ThumStickAngle_ wraps around, from about 6 to 0.5 I think). How can I solve this?
void Update () {
LastPadState_ = PadState_;
PadState_ = GamePad.GetState(ControllerIndex_);
if(PadState_.ThumbSticks.Left.X != 0 || PadState_.ThumbSticks.Left.Y != 0)
{
Vector2 LThumbstickNormal_ = new Vector2(PadState_.ThumbSticks.Left.X, PadState_.ThumbSticks.Left.Y);
LThumbstickNormal_.Normalize();
float ThumbStickAngle_ = Mathf.Atan2(LThumbstickNormal_.y, LThumbstickNormal_.x) + Mathf.PI;
float CarAngle_ = (transform.eulerAngles.z * Mathf.Deg2Rad % 360) ;
float TurnFactor_ = ((Mathf.Abs(ThumbStickAngle_ - CarAngle_) <(2*Mathf.PI) - Mathf.Abs(ThumbStickAngle_-CarAngle_)))? ThumbStickAngle_ - CarAngle_: 2*Mathf.PI -ThumbStickAngle_-CarAngle_; //Make sure car turns the least amount possible
TurnFactor_ = Mathf.Clamp(TurnFactor_,-MaxTurnAngle, MaxTurnAngle);
Debug.Log("TurnFactor_: " + TurnFactor_ + ", ThumbStickAngle_: " + ThumbStickAngle_ + ", CarAngle: " + CarAngle_);
transform.Rotate(transform.forward * TurnFactor_ * rigidbody2D.velocity.magnitude * TurnStrength);
}
transform.rigidbody2D.AddForce(-transform.right * Speed * PadState_.Triggers.Right);
}
Sorry about the sloppy code, if you need anything clarified please tell me. The problem probably lies around the line were I set the TurnFactor_. Also I'm using XInput for input.