Damage rate HELP

Hi!

I’m working on a damage script for the player, but I’m having a problem. Now when you walk on a specific trigger your player loses health and that works like it should. But what I want to implement is that when you stay in the trigger box you should lose health every second or two.

I’ve tried OnTriggerStay, but it wont work like I want it to. I think it calls it every frame, so the player loses all his health in like 1 second.

Here’s my script:

var damage  = 10;
var healthScript : Health;
var damageSound: AudioClip;
//Disable objects
var pauseScript : Pause;
var deathScreen : boolean;
var deathSound: AudioClip;
var PlayerObjects : GameObject;
var flashlightObjects : GameObject;
var cameraObjects : GameObject;
var interactionObjects : GameObject;

function OnTriggerEnter ()
{
	healthScript.healthPoints -= damage;
	AudioSource.PlayClipAtPoint(damageSound, transform.position);
//Death
	if (healthScript.healthPoints <= 0)
	{
		AudioSource.PlayClipAtPoint(deathSound, transform.position);
		healthScript.healthPoints = 0;
		deathScreen = true;
		Time.timeScale = 0;
		AudioListener.pause = true;
		Screen.showCursor = true;
		Screen.lockCursor = false;
//Disable components
		PlayerObjects.GetComponent(CharacterMotor).enabled = false;
	    PlayerObjects.GetComponent(SmoothMouseLook).enabled = false;
	    cameraObjects.GetComponent(SmoothMouseLook).enabled = false;
	    PlayerObjects.GetComponent(Footsteps).enabled = false;
	    PlayerObjects.GetComponent(Crosshair).enabled = false;
	 	flashlightObjects.GetComponent(Flashlight2).enabled = false;
	 	PlayerObjects.GetComponent(KeyInventory).enabled = false;
	 	PlayerObjects.GetComponent(BatteryInventory).enabled = false;
	 	PlayerObjects.GetComponent(HealthInventory).enabled = false;
		pauseScript.enabled = false;
		interactionObjects.SetActive(false);
		
		Destroy(gameObject);
	}
}

function OnTriggerStay ()
{
	healthScript.healthPoints -= damage;
	
	if (healthScript.healthPoints <= 0)
	{
		AudioSource.PlayClipAtPoint(deathSound, transform.position);
		healthScript.healthPoints = 0;
		deathScreen = true;
		Time.timeScale = 0;
		AudioListener.pause = true;
		Screen.showCursor = true;
		Screen.lockCursor = false;
//Disable components
		PlayerObjects.GetComponent(CharacterMotor).enabled = false;
	    PlayerObjects.GetComponent(SmoothMouseLook).enabled = false;
	    cameraObjects.GetComponent(SmoothMouseLook).enabled = false;
	    PlayerObjects.GetComponent(Footsteps).enabled = false;
	    PlayerObjects.GetComponent(Crosshair).enabled = false;
	 	flashlightObjects.GetComponent(Flashlight2).enabled = false;
	 	PlayerObjects.GetComponent(KeyInventory).enabled = false;
	 	PlayerObjects.GetComponent(BatteryInventory).enabled = false;
	 	PlayerObjects.GetComponent(HealthInventory).enabled = false;
		pauseScript.enabled = false;
		interactionObjects.SetActive(false);
		
		Destroy(gameObject);
	}
}

Does anyone know how to fix this?

It’s actually pretty easy: you can either use a timer like so:

var damageTimer : float;

    function OnTriggerStay ()
    {
        damageTimer += Time.deltaTime;
        if (damageTimer > [theDelayYouWantHere])
        {
            healthScript.healthPoints -= damage;
            damageTimer = 0;
        }
    
    }

Or you can use a CoRoutine. Now I’m not familiar with how CoRoutine are handled in javascript, but you can check the documentation for that. If I recall correctly, it’s easier in Javascript than it is in C# to use coroutines. :slight_smile:

Here’s the link to the docs: CoRoutines