Repeat Button Vehicle Steer

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!

I honestly believe that you should look into the Standard Assets(Mobile). They have thumb sticks and such for this type of thing. The premise is the use of GUITextures, which are positioned in world space. Then you just gauge the position of a thumb or mouse point on that button. This gives you an analog control in a digital environment.

Thanks for taking the time to respond.

I’ve been fiddling around with the thumb sticks now for two days and I simply can’t get them to work - I read all the IOS tutorials, Youtube tutorials, but none have worked or even come close to moving by car, either forward, back or left or right. I’ve fiddled with the inputs but no joy.

Shame as it would’ve work well which is why i’ve had to look at other alternatives.

Cheers.

could you share the script you are using for the control. (include the reference to the thumb sticks.)

I must admit that the issue was refrencing the thumb sticks in the code - I took apart PlayerRelativeControl.js and incorporated it into my Player_Car script below, I then adjusted and created new inputs for the joystick axis and changed the refrences at “Input.GetAxis(“Vertical”);” to the Joystick input name, but there was no affect. This is my entire code as it is using the horizontal and vertical sliders, I do have the Dual Joysticks set up in my Unity scene:

// These variables allow the script to power the wheels of the car.
var FrontLeftWheel : WheelCollider;
var FrontRightWheel : WheelCollider;
static var multiTouchEnabled : boolean; 

// 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 = 0.0;
var MaxEngineRPM : float = 3000.0;
var MinEngineRPM : float = 1000.0; 
private var EngineRPM : float = 0.0;

var MotorSliderInput : float = 0.0;

var slider = 100;

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() {
    
    MotorSliderInput = GUILayout.VerticalSlider (MotorSliderInput, 10.0, 0.0);
    
    if (MotorSliderInput > 7) {
    	
    	EngineTorque = 50;
    	motorInput = 1;
    
    }
    
        else if (MotorSliderInput < 7) {
    
    	motorInput = 0;
    	FrontLeftWheel.brakeTorque = 20;
		FrontRightWheel.brakeTorque = 20;
    	
    	}
    	
    slider = GUI.HorizontalSlider( Rect(20,135,175,30), slider, -50, 50);
    	
       if (slider < 10){
    	
    	FrontLeftWheel.steerAngle = 0;
	    FrontRightWheel.steerAngle = 0;
    	
    	}
    	
        else if (slider >= 10){
    	
    	FrontLeftWheel.steerAngle = -20;
	    FrontRightWheel.steerAngle =-20;
    	
    	}
    	
    	else if (slider <= 20){
    	
    	FrontLeftWheel.steerAngle = -20;
	    FrontRightWheel.steerAngle = -20;
    	
    	}
    	
    	else if (slider > 20){
    	
    	FrontLeftWheel.steerAngle = -30;
	    FrontRightWheel.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.

	//FrontLeftWheel.steerAngle = 30 * Input.GetAxis("Horizontal");
	//FrontRightWheel.steerAngle = 30 * Input.GetAxis("Horizontal");

	FrontLeftWheel.brakeTorque = 20 * Input.GetAxis("Fire1");
	FrontRightWheel.brakeTorque = 20 * Input.GetAxis("Fire1");
	

}

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;
	}
	
	}

I was more refering to your attempt to use the thumb sticks… :wink:

To be perfectly honest thats pretty much my attempt at using the thumb pads above.

I tried chopping and changing parts of my script with the PlayRelativeControl script and although it appeared to run ok, the vehicle wouldn’t move.

I’ve searched high and low for any information on getting a thumb pad to work with a car without luck, there are games that use it ofcourse so it clearly works.

I’m not asking for someone to create the entire script, I wouldn’t learn that way but any pointers would be freatly apreciated please.

Thanks.

Any ideas please?

Ok - good news, thumbstick is now moving - what i’ve got is this in function Update ():

this.transform.Translate(Vector3.forward * moveJoystick.position.x * speed);

Then declared the variable at the top:

var moveJoystick : Joystick;

What this infact does is move the car up into the air - the tricky bit, for me at least will be getting it to recogise my existing code that i’ve got in my op so the thumbstick responds just as the keyboard keys do…

I know this is not a very helpful answer, but take a look at Virtual Controls Suite. Its a great asset and and maybe saves a lot of time. There are also some tutorial from the developer explaining everything in detail.

Many thanks for your input, it’s much appreciated, although, as i’ve already got these thumbsticks to function aswell as the code to move the vehicle, all i’m really after is some tips about how to gel the two togeather.

Anymore advice with this please guys?