Hi guys,
I’m currently creating a moving vehicle with the use of GUI buttons. So far it’s going well, you can steer the car and also move it forward, however. I’m using GUI.RepeatButton (Also tried .Button)
When the user presses the button to steer the vehicle left, then doesn’t press the button, the steering angle stays at the left. Press the left steering button and the steering turns left, but doesn’t go back to the center. My problem is then that you either have to be steering left or right and not straight ahead! This is the script that i’m currently using - any ideas please? In other words, when the user presses the right button, the vehicle moves left, but when he takes his finger of it, the steering centers.
If I use the keyboard arrows to control the car, then the script works as it should, but this isn’t the case when using GUI buttons - i’d love to implement a Joystick, but i’ve really got no idea how to other than adding the Single Joystick prefab.
// These variables allow the script to power the wheels of the car.
var FrontLeftWheel : WheelCollider;
var FrontRightWheel : WheelCollider;
// These variables are for the gears, the array is the list of ratios. The script
// uses the defined gear ratios to determine how much torque to apply to the wheels.
var GearRatio : float[];
var CurrentGear : int = 0;
var btnTexture : Texture;
var btnTexture2 : Texture;
var btnTexture3 : Texture;
var btnTexture4 : Texture; // this is going to be the actual GUI Unity button that will allow you to assign a texture in the inspector for it.
var motorInput : int = 0; // this is going to be the the number that will tell the car if it's getting gas or not... o will be no gas and 1 will be 100% full throttle.
// These variables are just for applying torque to the wheels and shifting gears.
// using the defined Max and Min Engine RPM, the script can determine what gear the
// car needs to be in.
var EngineTorque : float = 230.0;
var MaxEngineRPM : float = 3000.0;
var MinEngineRPM : float = 1000.0;
static var multiTouchEnabled : boolean;
private var EngineRPM : float = 0.0;
function Start () {
// I usually alter the center of mass to make the car more stable. I'ts less likely to flip this way.
rigidbody.centerOfMass += Vector3(0, -.100, .25);
}
function OnGUI() {
if (!btnTexture) {
Debug.LogError("Please assign a texture on the inspector");
return;
}
if ((GUI.RepeatButton(Rect(30,430,65,65),btnTexture))) {// you will need to tweak these numbers...the first two are X and Y coordinates for where it will be on screen and the second two are pixel sizes for height and width of the button...those numbers will need to match the pixel size of your button texture.
motorInput = 1.0;
}
else
if ((GUI.RepeatButton(Rect(30,510,65,65),btnTexture2))) {// you will need to tweak these numbers...the first two are X and Y coordinates for where it will be on screen and the second two are pixel sizes for height and width of the button...those numbers will need to match the pixel size of your button texture.
motorInput = 0.0;
}
else
if ((GUI.RepeatButton(Rect(840,510,65,65),btnTexture3))) {// you will need to tweak these numbers...the first two are X and Y coordinates for where it will be on screen and the second two are pixel sizes for height and width of the button...those numbers will need to match the pixel size of your button texture.
FrontRightWheel.steerAngle = 30;
FrontLeftWheel.steerAngle = 30;
}
else
if ((GUI.RepeatButton(Rect(750,510,65,65),btnTexture4))) {// you will need to tweak these numbers...the first two are X and Y coordinates for where it will be on screen and the second two are pixel sizes for height and width of the button...those numbers will need to match the pixel size of your button texture.
FrontRightWheel.steerAngle = -30;
FrontLeftWheel.steerAngle = -30;
}
}
function Update () {
// Compute the engine RPM based on the average RPM of the two wheels, then call the shift gear function
EngineRPM = (FrontLeftWheel.rpm + FrontRightWheel.rpm)/2 * GearRatio[CurrentGear];
ShiftGears();
// set the audio pitch to the percentage of RPM to the maximum RPM plus one, this makes the sound play
// up to twice it's pitch, where it will suddenly drop when it switches gears.
audio.pitch = Mathf.Abs(EngineRPM / MaxEngineRPM) + 1.0 ;
// this line is just to ensure that the pitch does not reach a value higher than is desired.
if ( audio.pitch > 2.0 ) {
audio.pitch = 2.0;
}
// finally, apply the values to the wheels. The torque applied is divided by the current gear, and
// multiplied by the user input variable.
//FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
//FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * Input.GetAxis("Vertical");
FrontLeftWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * motorInput;
FrontRightWheel.motorTorque = EngineTorque / GearRatio[CurrentGear] * motorInput;
// the steer angle is an arbitrary value multiplied by the user input.
}
function ShiftGears() {
// this funciton shifts the gears of the vehcile, it loops through all the gears, checking which will make
// the engine RPM fall within the desired range. The gear is then set to this "appropriate" value.
if ( EngineRPM >= MaxEngineRPM ) {
var AppropriateGear : int = CurrentGear;
for ( var i = 0; i < GearRatio.length; i ++ ) {
if ( FrontLeftWheel.rpm * GearRatio[i] < MaxEngineRPM ) {
AppropriateGear = i;
break;
}
}
CurrentGear = AppropriateGear;
}
if ( EngineRPM <= MinEngineRPM ) {
AppropriateGear = CurrentGear;
for ( var j = GearRatio.length-1; j >= 0; j -- ) {
if ( FrontLeftWheel.rpm * GearRatio[j] > MinEngineRPM ) {
AppropriateGear = j;
break;
}
}
CurrentGear = AppropriateGear;
}
}
Many thanks for any help!