In rocket league, you are able to boost based on the direction you are facing. If the nose of your car is pointed upwards and you boost, there will be a force applied upwards. If the nose of your car is pointed to the left and down, a force is applied left and down. I'm trying to replicate this in Unity 3d, but I can't seem to get it to work. I'm assuming the boost should be based off the rotation, but I'm not sure how to do it.
I've tried all sorts of things.
My current code is
theRB.AddRelativeForce(transform.forward * boostAmount);
where theRB is the rigidbody for the car and boost amount is the magnitude of boost. I've also tried using the transform and doing transform.translate, but the car doesn't apply boost in the right direction (up and down).
Using AddRelativeForce doesn't work, AddForce doesn't work, Transform.translate doesn't work, I'm slowly giving up hope.
The car boosts forward initially, gives a jerk, and goes back to the starting place. When I try to boost upwards, it does it, but I can't control it in the air (I've set up proper car control in the air) and I can't boost downwards. I can't change the direction of the boost.
CodePudding user response:
It sounds like you are trying to apply a boost force to a car in a 3D game using Unity, but the force is not being applied in the correct direction based on the orientation of the car.
One way you can apply a force to a car in Unity that is based on the orientation of the car is to use the Rigidbody.AddForceAtPosition method. This method takes three arguments: a vector representing the force to apply, a vector representing the position at which to apply the force, and a ForceMode enum value indicating how the force should be applied.
Here is an example of how you can use the AddForceAtPosition method to apply a boost force to a car in Unity based on the orientation of the car:
// Get the position of the front of the car
Vector3 frontPos = car.transform.position car.transform.forward;
// Calculate the boost force based on the car's orientation
Vector3 boostForce = car.transform.forward * boostAmount;
// Apply the boost force at the front of the car
car.rigidbody.AddForceAtPosition(boostForce, frontPos, ForceMode.Impulse);
In this code, we first calculate the position of the front of the car by adding the car's position and forward vector. Then, we calculate the boost force by multiplying the forward vector of the car by the magnitude of the boost. Finally, we use the AddForceAtPosition method to apply the boost force at the front of the car, using the Impulse ForceMode to apply the force instantaneously.
This should apply the boost force in the direction that the car is facing, allowing you to control the direction of the boost based on the orientation of the car. You can adjust the code to suit your specific needs by modifying the frontPos and boostForce vectors. For example, if you want to apply the boost force at the center of the car instead of the front, you can use the following code:
// Get the position of the center of the car
Vector3 centerPos = car.transform.position;
// Calculate the boost force based on the car's orientation
Vector3 boostForce = car.transform.forward * boostAmount;
// Apply the boost force at the center of the car
car.rigidbody.AddForceAtPosition(boostForce, centerPos, ForceMode.Impulse);
Alternatively, if you want to apply the boost force in a direction that is not the same as the car's forward vector, you can modify the boostForce vector to point in the desired direction. For example, if you want to apply the boost force upwards, you can use the following code:
// Get the position of the front of the car
Vector3 frontPos = car.transform.position car.transform.forward;
// Calculate the boost force in the upwards direction
Vector3 boostForce = Vector3.up * boostAmount;
// Apply the boost force at the front of the car
car.rigidbody.AddForceAtPosition(boostForce, frontPos, ForceMode.Impulse);