- Home /
How to repeat damage
Hello, I am asking this question only after searching for similar ones and not finding a solution to the problem.
I have written this simple script that applies damage to my player when it enters a trigger.
var damage = 1;
function OnTriggerEnter(other:Collider)
{
if(other.gameObject.CompareTag("Player"))
{
other.gameObject.SendMessage("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
}
}
This works perfectly but the player is only hurt once each time the trigger is hit, I would like the player to keep recieving damage over time while in the trigger until they leave it.
I have tried setting up a timer for this.
var damage = 1;
var damageTimer = 0.0;
function OnTriggerEnter(other:Collider)
{
if(damageTimer==0.0)
{
if(other.gameObject.CompareTag("Player"))
{
damageTimer = Time.Time;
}
if((damageTimer+0.05) > Time.Time)
{
return;
}
else
{
other.gameObject.SendMessage("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
damageTimer = Time.Time;
}
}
This does not apply any damage at all and gives me a null reference exception but no other errors.
If someone could please point out to me what I have done wrong, it may be a simple solution but I just can't see it.
Thank you for reading.
Answer by Scribe · Mar 19, 2012 at 09:59 PM
I believe you could simply use OnTriggerStay:
var damage = 1;
function OnTriggerStay(other:Collider)
{
if(other.gameObject.CompareTag("Player"))
{
other.gameObject.SendMessage("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
}
}
However this method would then add damage every frame and would therefore you would probably want a very small damage variable, as well as this the frame rate will vary so the damage/second will also vary
Alternatively I might use the InvokeRepeating command to do something like this:
var damage = 1;
function OnTriggerEnter(other:Collider){
if(other.gameObject.CompareTag("Player")){
InvokeRepeating("Damage" /*function name*/, 0 /*amount of time to wait before starting the function*/, 0.5 /*how often to apply damage in seconds*/);
}
}
function OnTriggerExit(other:Collider){
CancelInvoke("Damage");
}
function Damage () {
other.gameObject.SendMessage("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
}
That code is untested I'm afraid so forgive me if it doesn't work straight off but you could play around with that idea.
Hope that helps,
Scribe
Your answer
Follow this Question
Related Questions
Trigger and ennemy damage 2 Answers
Destructible GameObject OnTriggerEnter2D getting called twice 1 Answer
Enable/Disable script with timer 1 Answer
close game in delay after pressing button 1 Answer
Need help with game points and trigger 2 Answers