x


How to make this enemy script shoot upwards?

Hey,

I'm new to unity and I have this script for one of my enemies. The only problem is that I've been trying to make them shoot upwards when I jump in the air. They only seem to shoot straight and not on the Y axis. I've been looking for a solution on the internet for a couple of days now, but without any luck so I decided to try here.

Thank you for your time!

private var target : Transform; 
    var rotateSpeed = 20;
    var moveSpeed = 5;
    var hitPoints = 10;
    var bulletDEAD : Transform;
    var explosionDEAD :  Transform;
    private var dead : boolean = false;
    private var currentHitPoints = hitPoints;
    var liftForce = 50;
    var projectile : Rigidbody;
    var Points1 : GameObject;
    var Points2 : GameObject;
    var ScoreAmount = 10;
    var force = 12.0;
    var damage = 5.0;
    var bulletsPerClip = 60;
    static var clips = 20;
    var reloadTime = 0.5;
    var hitParticles : ParticleEmitter;
    var muzzleFlash : Renderer;
    public var triggerTime = 0.05f;
    private var bulletsLeft : int = 0;
    private var nextFireTime = 0.0;
    private var m_LastFrameShot = -1;
    var bulletVelocity = 40;


    function Start () {
    // get the ParticleEmitter component from the object
    hitParticles = GetComponentInChildren(ParticleEmitter);

    // emit particles only when we hit something.
    if (hitParticles)
       hitParticles.emit = false;
    bulletsLeft = bulletsPerClip;

    // search for the player tagger "player"
    if (target == null && GameObject.FindWithTag("Player"))  
           target = GameObject.FindWithTag("Player").transform;
        currentHitPoints = hitPoints;

    }

    // function to destroy the object if it gets out of bounds
    function ColliderBoundDamage (damage : float) {    
    var spawner : SpawnManager = GetComponent(SpawnManager);

       if (currentHitPoints <= 0)
         return;

       currentHitPoints -= damage;

       if (!dead && currentHitPoints <= 0) {
            dead = true;                              // changes the "dead" boolean option to true
            Destroy(gameObject);                 // destroy the gameObject
         spawner.amountEnemies -= 1;      // inform the spawn manager about the object's death

       }
    }

    // function for getting killed by a bullet
    function ApplyBulletDamage (damage : float) {     
    var spawner : SpawnManager = GetComponent(SpawnManager);

       if (currentHitPoints <= 0)
         return;

       currentHitPoints -= damage;

       if (!dead && currentHitPoints <= 0) {
            dead = true;
            Destroy(gameObject);
         Instantiate(Points1, transform.position, Quaternion.identity);     // spawn a 3d text containing information about points
         Instantiate(bulletDEAD, transform.position, transform.rotation); // spawn a dead replacement of the object 
         spawner.amountEnemies -= 1;      // inform the spawn manager about the object's death
         GUIController.MyScoreCounter += ScoreAmount;  // Add scores!

       }
    }

    //function for getting killed by an explosion
    function ApplyExplosionDamage (damage : float) {  
       var spawner : SpawnManager = GetComponent(SpawnManager);

       if (currentHitPoints <= 0)
         return;

       currentHitPoints -= damage;

       if (!dead && currentHitPoints <= 0) {
            dead = true;
            Destroy(gameObject);
         Instantiate(Points2, transform.position, Quaternion.identity);     // spawn a 3d text containing information about points
         Instantiate(explosionDEAD, transform.position, transform.rotation); // spawn a dead replacement of the object 
         spawner.amountEnemies -= 1;      // inform the spawn manager about the object's death
         GUIController.MyScoreCounter += ScoreAmount;  // Add scores!
       }
    }


    function FixedUpdate () {
        if (target == null)
           return;

       var direction  = transform.TransformDirection(Vector3.forward);
       var hit : RaycastHit;


         // the climb object part
        if (Physics.Raycast(transform.position, direction, hit, 3)) {  // raycast 3 units ahead of the object
            if (hit.transform.tag == "Climb" && !dead) {           // if the raycast hits an object tagged "Climb"
                transform.rigidbody.AddForce(Vector3.up *liftForce);    // lift the object up until it overcomes the obstacle
            }
        }


        // the rotate part
        if (target && !dead) {
            var rot = Quaternion.LookRotation(target.position - transform.position);
            var rotationX = rot.eulerAngles.y;
            var xQuaternion = Quaternion.AngleAxis(rotationX, Vector3(0, 1l, 0));

           transform.localRotation = Quaternion.Slerp(transform.localRotation, xQuaternion, Time.deltaTime * rotateSpeed);
            }
       // the shoot part
       // detect the distance between the player and the enemy
        var dist = Vector3.Distance(target.position, transform.position);     
       if ( dist < Random.Range(20, 30) )    // if in range, shoot!
        Fire();

       else 
        // if not, keep walking!
        if ( dist < Random.Range(50, 60)  )
        transform.rigidbody.MovePosition(transform.rigidbody.position + transform.TransformDirection(0, 0, moveSpeed) * Time.deltaTime);

    }

function LateUpdate() {
    if (muzzleFlash) {
       if (m_LastFrameShot == Time.frameCount) {
         muzzleFlash.enabled = true;


       } else {
       // Don't show muccle flash if we're not firing
         muzzleFlash.enabled = false;
         enabled = false;

         // Play Gunfire sound
         if (audio)
         audio.Play();
         audio.loop = false;



       }
    }
}

//the fire part
function Fire () {
       var fireRate = Random.Range(0.1, 0.2);  // give a small range of fireRate values to the enemies


    // Keep firing until we used up the fire time
    while( nextFireTime < Time.time && bulletsLeft != 0) {
       FireOneShot();
       nextFireTime += fireRate;
       }
}

function FireOneShot () {
    var direction = transform.TransformDirection(Random.Range(-0.05f, 0.05f) * triggerTime, Random.Range(-0.05f, 0.05f) * triggerTime, 1);
    var hit : RaycastHit;
    var clone : Rigidbody;

audio.Play(); // play the shoot sound
// instantiate a projectile
clone = Instantiate(projectile, transform.position, transform.rotation);
// and make it shoot forward by giving it a velocity
clone.velocity = transform.TransformDirection (Vector3.forward * bulletVelocity);
// ignore collision with the roof collider so that the enemy doesnt hurt itself from shooting
Physics.IgnoreCollision( clone.collider, transform.root.collider );

    // raycasts forward
    if (Physics.Raycast (transform.position, direction, hit)) {
       // Apply a force to the rigidbody we hit
       if (hit.rigidbody)
         hit.rigidbody.AddForceAtPosition(force * direction, hit.point);


       // spawn hit particle effects to the normals we hit
       if (hitParticles) {
         hitParticles.transform.position = hit.point;
         hitParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
         hitParticles.Emit();



       }

       // Send a damage message to the hit object         
       hit.collider.SendMessageUpwards("ApplyPlayerDamage", damage, SendMessageOptions.DontRequireReceiver);
       hit.collider.SendMessageUpwards("ApplyPropsDamage", damage, SendMessageOptions.DontRequireReceiver);

    }
    // get bullets left
    bulletsLeft--;

    // Register that we shot this frame,
    // so that the LateUpdate function enabled the muzzleflash renderer for one frame
    m_LastFrameShot = Time.frameCount;
    enabled = true;

    // Reload gun in reload Time     
     if (bulletsLeft == 0)
      Reload();
      return;   
}

// a reload function to make sure the enemy isn't overpowered by giving it a brief reload time every 
// time it shoots
function Reload (){ 
// wait for a specific amount of time
yield WaitForSeconds(reloadTime); 

   clips--;
    bulletsLeft = bulletsPerClip; 
}
more ▼

asked Apr 27 '12 at 08:38 AM

decerto gravatar image

decerto
37 2 3 5

(comments are locked)
10|3000 characters needed characters left

1 answer: sort newest

here is your problem i think:

// and make it shoot forward by giving it a velocity
clone.velocity = transform.TransformDirection (Vector3.forward * bulletVelocity);

you should do something like:

var ShootDir : Vector3;

if (!InJump) {
     ShootDir = Vector3.forward;
} else {
     // Change 0.3 to what fits you.
     ShootDir = Vector3.forward + Vector3(0,0.3,0);
}

clone.velocity = transform.TransformDirection (ShootDir * bulletVelocity);

The InJump is a boolean you can change in your jump code. You would also have to update your raycast direction with the same value, i think. PS.: I`m usually coding in c#.

more ▼

answered Apr 27 '12 at 01:24 PM

bompi88 gravatar image

bompi88
741 2 5

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x960
x655
x329
x4

asked: Apr 27 '12 at 08:38 AM

Seen: 610 times

Last Updated: Apr 27 '12 at 01:24 PM