x


health not subtracting

i made a script for a ship because i wanted to be able to destroy certain parts of it when they take enough damage, except the health variable doesn't go down.

i can see the sparks from the bullets and they are hitting the ship and if i shoot a missile it will explode on the ship but it takes no damage.

here's my script:

var health = 1000;

function OnCollisionEnter () {
health -= 50;  //asteroids, missiles and fighters
}

function ApplyDamage () {
health -= 1; //bullets
}

function Update () {
if(health <= 0){
Destroy(gameObject); //Destroy the ship when it has no health (no explosion yet)
}
}

anyone know the problem?

more ▼

asked Jan 23 '12 at 05:38 AM

sam32x gravatar image

sam32x
178 40 56 62

Put some Debug.Log in that OnCollisionEnter function, make sure that it is definitely getting called.

Jan 23 '12 at 05:53 AM syclamoth

well i put Debug.Log in and it got called for the missiles 3 times out of 5 but not for bullets

Jan 23 '12 at 07:13 AM sam32x

this is my gun script

var shotSound: AudioClip;
var bloodPrefab: GameObject;
var sparksPrefab: GameObject;
var loaded = 1;
var ammo = 0;
var startammo = 99999999;
var ableToFire = 1;
var muzzleflash : GameObject;
var dElay : float = 0;

function Start() {
ammo = startammo;
}

function Update () {
if (Input.GetButton("Fire1")){
if (loaded == 1){
if(ableToFire == 1){
if(ammo != -1){
        Invoke("Shoot",dElay);
    }
    }
    }
    }
    if (ammo == 0){
    ammo = -1;
    loaded = 0;
    Invoke("reload", 3);
    }
    }

    function Shoot(){
    ammo -= 1;
    ableToFire = 0;
    Instantiate(muzzleflash, transform.position, transform.rotation);
    Invoke("rechamber",0.12);
    if (shotSound) audio.PlayOneShot(shotSound);
    var hit: RaycastHit;
    if (Physics.Raycast(transform.position, transform.forward, hit)){
        var rot = Quaternion.FromToRotation(Vector3.up, hit.normal);
        if (hit.transform.tag == "Enemy"){
            if (bloodPrefab) Instantiate(bloodPrefab, hit.point, rot);
            hit.transform.SendMessage("ApplyDamage", SendMessageOptions.DontRequireReceiver);
        } else {
            if (sparksPrefab) Instantiate(sparksPrefab, hit.point, rot);
        }
    }
}

function reload() {
loaded = 1;
ammo = startammo;
}

function rechamber() {
ableToFire = 1;
}
Jan 23 '12 at 07:23 AM sam32x
(comments are locked)
10|3000 characters needed characters left

1 answer: sort newest

That script would work as-is, so there must be some other factor involved. However it's not very efficient to constantly check the health in Update, given that it only changes occasionally. Instead just check when you need to:

var health = 1000;

function OnCollisionEnter () {
    ChangeHealth (-50); //asteroids, missiles and fighters
}

function ApplyDamage () {
    ChangeHealth (-1); //bullets
}

function ChangeHealth (amount : int) {
    health += amount;
    if (health <= 0) {
        Destroy(gameObject); //Destroy the ship when it has no health (no explosion yet)
    }
}
more ▼

answered Jan 23 '12 at 05:52 AM

Eric5h5 gravatar image

Eric5h5
80.3k 42 132 521

(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:

x384
x249
x227

asked: Jan 23 '12 at 05:38 AM

Seen: 508 times

Last Updated: Jan 23 '12 at 07:23 AM