Code optimization help.

Hello,

I’ve done nearly all I could with textures/display optimization. But, now, how could I optimize code for better performance? What ways are better than others for scripting? Thanks. :slight_smile:

To make the best choices about optimising code you really need to profile. If you don’t have Pro Unity then this is a problem…

but generally the best optimisation you can do is to do things once. Instead of getting a component each frame, Get it a reference to it in Start() etc etc… but unless your know exactly what is slow, it’s pretty hit and miss as to if you’ll speed up your code at all. And unless you have the stats from profiling you don’t know if your changes have speed it up at all, they may even slow it down.

I do not have Unity Pro. :frowning: All of my things that need to be once are in Awake(). I do not know of anything else I could do. Here is my extremely long script. Any tips, or things you can help me fine? :slight_smile:

var flWheelCollider : WheelCollider;
var frWheelCollider : WheelCollider;
var rlWheelCollider  : WheelCollider;
var rrWheelCollider: WheelCollider;
var maxTorque = 150;
var maxBrakeTorque= 500;
var maxSteerAngle = 30;
var maxSpeed : int = 200;
var maxBackwardSpeed : int = 40;
var currentSpeed : float =0.0;
private var isBraking : boolean=false;
var guiSpeed : GUIText;
var flWheel : Transform;
var frWheel : Transform;
var rlWheel : Transform;
var rrWheel : Transform;
var gearSpeed : int [];
private var currentGear : int = 0;
var FullBrakeTorque: float = 5000;
var brakeSound : AudioClip;

private var oldForwardFriction : float =0.00;
private var oldSidewaysFriction : float =0.00;
private var newForwardFriction : float =0.01;
private var newSidewaysFriction : float =0.01;
private var stopForwardFriction : float =0.5;
private var stopSidewaysFriction : float =0.01;
private var brakeAudioSource : AudioSource;
private var isPlayingSound : boolean = false;
 
function Start () {	
	
	guiSpeed = gameObject.Find("MPH").guiText;
    rigidbody.centerOfMass = Vector3(0, -.64, 0);
	oldForwardFriction = frWheelCollider.forwardFriction.stiffness;
	oldSidewaysFriction = frWheelCollider.sidewaysFriction.stiffness;
	brakeAudioSource = gameObject.AddComponent(AudioSource);
	brakeAudioSource.clip = brakeSound;
		
}

function FixedUpdate () {
    		
	FullBraking ();
	
	if (((currentSpeed> 0)  (Input.GetAxis("Vertical") <0 )) || ((currentSpeed< 0)  (Input.GetAxis("Vertical") > 0 ))){
	  	isBraking = true;
	}
	else {
		isBraking = false;
		flWheelCollider.brakeTorque =0;
		frWheelCollider.brakeTorque =0;
		
	}
	
	if (isBraking ==false) {
		if ((currentSpeed < maxSpeed)  (currentSpeed > (maxBackwardSpeed*-1))){
			
			rlWheelCollider.motorTorque =  maxTorque * Input.GetAxis("Vertical");
			rrWheelCollider.motorTorque = maxTorque * Input.GetAxis("Vertical");	
			
		}
		else {
			flWheelCollider.motorTorque =  0;
			frWheelCollider.motorTorque =  0;
		}
	}
	else {
		flWheelCollider.brakeTorque = maxBrakeTorque;
		frWheelCollider.brakeTorque = maxBrakeTorque;
		flWheelCollider.motorTorque =  0;
		frWheelCollider.motorTorque =  0;
	}
	
	flWheelCollider.steerAngle = maxSteerAngle  * Input.GetAxis("Horizontal");
	frWheelCollider.steerAngle = maxSteerAngle  *  Input.GetAxis("Horizontal");
	
	guiSpeed.text = currentSpeed .ToString();
	
	SetCurrentGear();
	GearSound();
	
}

function FullBraking (){
	if(Input.GetKey("space")){		
		rlWheelCollider.brakeTorque =FullBrakeTorque;
		rrWheelCollider.brakeTorque =FullBrakeTorque;
		
		if ((Mathf.Abs(rigidbody.velocity.z)>1) || (Mathf.Abs(rigidbody.velocity.x)>1)){
		
			SetFriction(newForwardFriction,newSidewaysFriction);	
			SetBrakeEffects(true);	
		}
		else{
			SetFriction(stopForwardFriction,stopSidewaysFriction);	
			SetBrakeEffects(false);		
		}
		
	}
	else{		
		rlWheelCollider.brakeTorque =0;
		rrWheelCollider.brakeTorque =0;
		SetFriction(oldForwardFriction,oldSidewaysFriction);	
		SetBrakeEffects(false);		
	}	
}
	
function SetFriction(MyForwardFriction :float,MySidewaysFriction:float){

	frWheelCollider.forwardFriction.stiffness = MyForwardFriction;
	flWheelCollider.forwardFriction.stiffness = MyForwardFriction;
	rrWheelCollider.forwardFriction.stiffness = MyForwardFriction;
	rlWheelCollider.forwardFriction.stiffness = MyForwardFriction;
	
	frWheelCollider.sidewaysFriction.stiffness = MySidewaysFriction;
	flWheelCollider.sidewaysFriction.stiffness = MySidewaysFriction;
	rrWheelCollider.sidewaysFriction.stiffness = MySidewaysFriction;
	rlWheelCollider.sidewaysFriction.stiffness = MySidewaysFriction;
		
}

function SetBrakeEffects(PlayEffects : boolean){
	var isGrounding : boolean = false;
	var skidmarkPos : Vector3;
	
	if(PlayEffects == true){
	
	var  hit : WheelHit;
	
	if(rlWheelCollider.GetGroundHit(hit)){
	
	GameObject.Find("DustL").particleEmitter.emit=true;
	isGrounding = true;
	}
	
	else {
	
	GameObject.Find("DustL").particleEmitter.emit=false;
		
	}
	
	if(rrWheelCollider.GetGroundHit(hit)){
	
	GameObject.Find("DustR").particleEmitter.emit=true;
	isGrounding = true;
	}
	
	else {
	
	GameObject.Find("DustR").particleEmitter.emit=false;
	
	}
	
		if((isPlayingSound==false)(isGrounding==true)){
			isPlayingSound = true;
			brakeAudioSource.Play();
							}
	}
		
	else{
		isPlayingSound = false;
		brakeAudioSource.Stop();
		GameObject.Find("DustL").particleEmitter.emit=false;
		GameObject.Find("DustR").particleEmitter.emit=false;
	}

}

function Update () {
currentSpeed = (Mathf.PI * 1.5 * flWheelCollider.radius) * flWheelCollider.rpm *60 /1000;
currentSpeed = Mathf.Round(currentSpeed);
	RotateWheels();	
	SteelWheels();
	
}

function RotateWheels(){
	flWheel.Rotate(flWheelCollider.rpm / 60 * 360 * Time.deltaTime ,0,0);	
	frWheel.Rotate(frWheelCollider.rpm / 60 * 360 * Time.deltaTime ,0,0);	
	rlWheel.Rotate(rlWheelCollider.rpm / 60 * 360 * Time.deltaTime ,0,0);	
	rrWheel.Rotate(rrWheelCollider.rpm / 60 * 360 * Time.deltaTime ,0,0);	
}

function SteelWheels() {
	flWheel.localEulerAngles.y = flWheelCollider.steerAngle - flWheel.localEulerAngles.z ;
	frWheel.localEulerAngles.y = frWheelCollider.steerAngle - frWheel.localEulerAngles.z ;
}

function SetCurrentGear(){
	var gearNumber :int;
	gearNumber = gearSpeed.length;
	
	for (var i=0; i< gearNumber;i++){
		if(gearSpeed[i]>currentSpeed){
			currentGear = i;
			break;
		}
	}
}

function GearSound(){
	var tempMinSpeed : float=0.00;
	var tempMaxSpeed : float =0.00;
	var currentPitch : float =0.00;
	
	switch (currentGear) {
		case 0:
			tempMinSpeed =0.00;
			tempMaxSpeed = gearSpeed[currentGear];
			break;
			
		default:
			tempMinSpeed = gearSpeed[currentGear -1];
			tempMaxSpeed = gearSpeed[currentGear];
	}
	
	currentPitch =((Mathf.Abs(currentSpeed) - tempMinSpeed)/(tempMaxSpeed-tempMinSpeed)) + .8;
	audio.pitch = currentPitch;
}

Again, without a profiler I can’t really help you. It may be possible to find and include a third party profiling tool, but I’ve never tried as the Unity one does the job for now.