Advanced Projectile

So currently, my script will allow me to move, and when I press 1, it shoots 1 projectile. The only problem is after it finishes shooting, I get a nullreferenceexception error, stating that there's a problem on line 38. How can I stop this and allow my character to move once he's shot the projectile?

Here's the code:

// Movement Variables:
private var jumpSpeed:float = 15.0; 
private var gravity:float = 50.0; 
private var runSpeed:float = 35; 
private var walkSpeed:float = 35; 
private var rotateSpeed:float = 250.0; 
private var grounded:boolean = false; 
private var moveDirection:Vector3 = Vector3.zero; 
private var isWalking:boolean = true; 
private var isMoveable:boolean = true;
private var isCasting:boolean = false;
private var isReadyToShoot:boolean = false;
private var moveStatus:String = "idle"; 
private var xSpeed = 250.0; 
private var ySpeed = 120.0; 
private var yMinLimit = -40; 
private var yMaxLimit = 80;
private var x = 0.0; 
private var y = 0.0; 
private var dead = false;
private var savedTime = 0;

var meteorPrefab:Transform;

// -------------------------------------------------------------------------------------------------------------
// -----------------------------------------------------------Animations ---------------------------------------
// -------------------------------------------------------------------------------------------------------------

function Do1() 
{
    yield WaitForSeconds(1.3);
    isReadyToShoot = true;
}

function Do2()
{
    var meteor = Instantiate(meteorPrefab, GameObject.Find("meteorSpawnPoint").transform.position, transform.rotation);
    meteor.rigidbody.AddForce(transform.forward * 2000);
    GameObject.Find("meteorSpawnPoint").active= false;
    yield WaitForSeconds(0.6);
    isMoveable = true;
    isWalking = true;
    isCasting = false;
    isReadyToShoot = false;
}
// -------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------- Death ---------------------------------------
// -------------------------------------------------------------------------------------------------------------

function OnControllerColliderHit(hit : ControllerColliderHit)
{
    if(hit.gameObject.tag == "fallout")
    {
        dead = true;
        //subtract life here
        HealthControl.LIVES -= 1;
    }
}
// -------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------- Movement ---------------------------------------
// -------------------------------------------------------------------------------------------------------------

function Update () 
{
   // Only allow movement and jumps while -----------------  GROUNDED -------------
   if(grounded) {
        moveDirection = new Vector3((Input.GetMouseButton(1) ? Input.GetAxis("Horizontal") : 0),0,Input.GetAxis("Vertical"));  
        if(Input.GetMouseButton(1) && Input.GetAxis("Horizontal") && Input.GetAxis("Vertical")) { 
            moveDirection *= .7; 
    } 
        moveDirection = transform.TransformDirection(moveDirection); 
        moveDirection *= isWalking ? walkSpeed : runSpeed; 
        moveStatus = "idle"; 
        if(moveDirection != Vector3.zero) 
        {
            moveStatus = isWalking ? "walking" : "running"; 
            if (isWalking)
            {
                animation.CrossFade("run");
            } else {
                // call RUN animation here
            }
            } else {
                animation.CrossFade("Take 001");
            }
        }
        if(isCasting == true)
        {
            animation.CrossFade("meteor");
            isMoveable = false;
            isWalking = false;
            Do1();
        }
    if(isReadyToShoot == true)
    {
        Do2();
    }
// -------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------- Specials ------------------------------------
// -------------------------------------------------------------------------------------------------------------

// Meteor Special

    if(isCasting == false)
    {
        if(Input.GetKeyDown("1"))
        {
            isCasting = true;
        }
    }
// -------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------- Controls ------------------------------------
// -------------------------------------------------------------------------------------------------------------

    // Allow turning at anytime. Keep the character facing in the same direction as the Camera if the right mouse button is down. 
    if(Input.GetMouseButton(1))
    {
        transform.rotation = Quaternion.Euler(0,Camera.main.transform.eulerAngles.y,0); 
    } else { 
        transform.Rotate(0,Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime, 0); 
    } 

    // Toggle walking/running with the T key 
    if(Input.GetKeyDown("t"))
    {
        isWalking = !isWalking; 
    }

    //Apply gravity 
    if(isMoveable)
    {
        moveDirection.y -= gravity * Time.deltaTime; 
    }
    //Move controller 
    if(isMoveable)
    {
        var controller:CharacterController = GetComponent(CharacterController); 
        var flags = controller.Move(moveDirection * Time.deltaTime); 
        grounded = (flags & CollisionFlags.Below) != 0; 
    };
    }
    static function ClampAngle (angle : float, min : float, max : float) { 
   if (angle < -360) 
      angle += 360; 
   if (angle > 360) 
      angle -= 360; 
   return Mathf.Clamp (angle, min, max); 
} 

// -------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------- END UPDATE  --------------------------------
// -------------------------------------------------------------------------------------------------------------

function LateUpdate()
{
    if(dead)
    {
        transform.position = Vector3(1341.832,0.1636853,1158.249);
        gameObject.Find("Camera") .transform .position = Vector3(1341.832,0.1636853,1135.249);
        dead = false;
    }
}

// -------------------------------------------------------------------------------------------------------------
// ----------------------------------------------------------- END LATEUPDATE  --------------------------------
// -------------------------------------------------------------------------------------------------------------
@script RequireComponent(CharacterController)

When you wait for .6 seconds, readyToShoot remains true, and Update is getting called (a lot), each time, will spawn a new one. You may want to set that false before the 'wait'

I just got an idea just do something like this:

function Do1() 
{
    yield WaitForSeconds(1.3);
    GameObject.Find("meteorSpawnPoint").active = true;
    isReadyToShoot = true;
}

function Do2()
{
    var meteor = Instantiate(meteorPrefab, GameObject.Find("meteorSpawnPoint").transform.position, transform.rotation);
    meteor.rigidbody.AddForce(transform.forward * 2000);
    GameObject.Find("meteorSpawnPoint").active= false;
    yield WaitForSeconds(0.6);
    isMoveable = true;
    isWalking = true;
    isCasting = false;
    isReadyToShoot = false;
}

as you can see i add GameObject.Find("meteorSpawnPoint").active= true; so like that it make it true then false and do the same.

As was stated above, GameObject.Find() only returns active objects (it's stated in the docs, too). So the statement `GameObject.Find("meteorSpawnPoint").active = true;` is meaningless and will most likely also generate an NRE if it gets executed unless you have more objects with that name that are active.

I'm not quite sure what you're even trying to do here, but presumably you're just trying to hide the 'launcher' until the player fires again. If that's true, what you should do is keep a variable of the spawn point so you can either activate/deactivate it, or (the preferred choice) disable its renderer (or meshrenderer as the case may be). Throw something like this into your Awake or Start method:

var meteorSpawnPoint: GameObject = GamEObject.Find("meteorSpawnPoint");

Then use

meteorSpawnPoint.active = true; // or false
OR

meteorSpawnPoint.GetComponent(MeshRenderer).enabled = true; // or false

Edit for comment clarify:

Typically your launch function would look roughly like this:

function DoFireball()
{
if (!isCasting)
{
isCasting= true;
animation.Play("fireball");
yield WaitForSeconds(animation["fireball"].length);
Instantiate (....); // do the launching thing
yield WaitForSeconds(shotDelay); // how often can we fire?
isCasting = false;
}
}

and then your Update function would look like:

function Update()
{
if (Input.GetKeyDown("1"))
{
DoFireball();
}
}