Script lowering frame rate

Hello UA people.

My frame rate isn’t particularly low at the moment, but i am exporting to flash so want to optimize it as much as i possibly can.

Profiler is indicating that the below script is at 39.8% not sure exactly what these figures mean, but it surely can’t be good.

Can anyone recommend alterations to this script that would be more efficient? It should be pretty straight forward to you guys, but if anything is unclear i’ll happily explain.

I realise there is a lot in the update, but as far as i can figure there isn’t any other way, but i’m sure i’m wrong! haha.

Cheers guys!

#pragma strict
var playerInRange : boolean = false;
var waypoints : Transform [];
var currentPoint : int = 0;
var state : String = "patrol";
var speed : float = 3;
var gravity : float = 15;
private var controller : CharacterController;
private var player : Transform;
var shooting : boolean = false;
var bulletFab : Rigidbody;
var gunTip : Transform;
var power : float = 1000;
var shotDelay : float = 1;

private var bullet : Transform;


function Start(){

	player = gameObject.FindWithTag("Player").transform;
	controller = GetComponent(CharacterController);	
}

function OnTriggerEnter (hitPlayer : Collider) {
	
	
	
	if(hitPlayer.gameObject.tag == "Player") {
			
		Debug.Log("collision detected");

		playerInRange = true; 
		
		
	}	
	
	
}

function Update () {
	if(player) {
	
		if (playerInRange == true) {
			state = "chase";
			Debug.Log("state is chase");	
		}else{
			state = "patrol";
			Debug.Log("state is patrol");
		}
		
		if(state == "patrol"){
		
			if(currentPoint < waypoints.length) {
				Mover(waypoints[currentPoint].position);	
			}
		
		} else if (state == "chase"){
		if(!shooting) shootStuff();
		Mover(player.position);
		}
	}
}

function Mover(target : Vector3){

	var diffVector: Vector3 = target - transform.position;
	
	var movement : Vector3;
	
	if(diffVector.magnitude > 1){
	 movement = (diffVector.normalized * speed);//without this it will run toward something and slow down when it gets close.	
	 
	}else{
		currentPoint = (currentPoint + 1) % waypoints.length;
		
	}
	
	movement.y -= gravity * Time.deltaTime;
	controller.Move(movement * Time.deltaTime);
	
	if(state == "patrol") {
		transform.LookAt(target);
	} else if (state =="chase"){
		transform.LookAt(Vector3(player.transform.position.x, transform.position.y, player.transform.position.z));
	}
	// look at waypoints, works because waypoints are the same height as the player.
	// then if it's chase look at the player but only on the y axis
	// also the other axis are frozen. 
}

function shootStuff(){
	
	shooting = true;
	
	var fwd = transform.TransformDirection(Vector3.forward);
	var bulletShot : Rigidbody = Instantiate(bulletFab, gunTip.position, gunTip.rotation);
	bulletShot.AddForce(fwd);
	
	yield WaitForSeconds(shotDelay);
	shooting = false;
	
	if(gameObject.FindWithTag("bullet")) {
		
		yield WaitForSeconds(4);
		Destroy(gameObject.FindWithTag("bullet"));
		
	
	}
	
}

Use this just change the frameRate variable to whatever you want

var frameRate : int = 300;

function Awake () {
    // Make the game run as fast as possible in the web player
    Application.targetFrameRate = frameRate;
}

Source: http://unity3d.com/support/documentation/ScriptReference/Application-targetFrameRate.html

EDIT

if you go Edit > Project Settings > Time

it will give you three options:

Fixed Timestep

Maximum Allowed Timestep

Time Scale

the fixed timestep will allow you to control the framerate and the maximum allowed timestep will allow you to set the maximum framerate.

Hope it helps

You might try deep profiling. It’ll slow down your game while it’s active, but it also provides a lot more information, specifically including nested function calls, which makes it much more useful for identifying hotspots.

Beyond that, I notice two things:

Calling Debug.Log() on a regular basis can slow down your game. Each log can cost several milliseconds, which adds up pretty quickly in performance-critical functions like Update().

Looks like you’re calling WaitForSeconds() from shootStuff(), which in turn is called from Update(). Calling any blocking operation from your update loop seems like an extremely bad idea, if it’ll work at all. Perhaps instead you might compare the last shot time against Time.time, or start a coroutines to manage some of those flags.

Otherwise, I didn’t notice anything obviously amiss, but it’s easy to overlook problems. My main advice is still to check out deep profiling, and look for functions which seem to take more time than they ought to.

you aren’t doing anything in an outrageously silly way. However, a couple of tips that might help:

  1. use enums instead of strings to hold your state variable. E.G.

    enum MovementState {PATROL, CHASE}
    var currentState : MovementState = MovementState.PATROL;

    void Update() {
    if(currentState == MovementState.PATROL) {
    //Patrol code
    } else if(currentState == MovementState.CHASE) {
    //Chase code
    }
    }

  2. You should delegate the bullet destroying behaviour at the end of your shootStuff() method to the bullet itself. E.G create a new Script DestroyAfterDelay.js and attach it to your bullet prefab. In DestroyAfterDelay.js have:

    var lifeTime : float;

    function Start() {
    yield WaitForSeconds(lifeTime);
    Destroy(gameObject);
    }

or something along those lines