Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by DanProd · Feb 19, 2019 at 01:38 PM · c#playerwaitforsecondswaithealth

Wait in seconds before damaging the player again

Title says it all, basically I have a problem where my script damage the player in every second, I want to tell the script that it should be waiting like 5 seconds before damaging again.`{

 public int Pain = 1;

 void Start()
 {

 }

void OnTriggerStay (Collider other) { {

         if (other.gameObject.tag == "Player")

         {
             StartCoroutine(CountDown());

         Vector3 damageDirection = other.transform.position - transform.position;
             damageDirection = damageDirection.normalized;

             FindObjectOfType<PlayerHealth>().DamagePlayer(Pain, damageDirection);


         }
     }
 }
 IEnumerator CountDown()
 {
     print(Time.time);
     yield return new WaitForSeconds(1000);
     print(Time.time);
 }

} `

Comment
Add comment · Show 2
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image DCordoba · Feb 19, 2019 at 02:37 PM 0
Share

As @TreyH said you don't need a coroutine to do this, I also suggest to store in a var the PlayerHealth script, to don't call the FindObjectOfType each time apply damage

   PlayerHealth healthScript;
    void Start(){
          healthScript = FindObjectOfType<PlayerHealth>();
     }

whatever if you still want to use coroutines you have to manage it, you are calling one different on each OnTriggerStay this (by default) is activated each 0.2 seconds... yes, very low for a bullet but ok by static acid/radiation...

  Coroutine damager;
  Vector3 damageDirection = Vector3.zero;
  void OnTriggerStay (Collider other) { 

          if (other.gameObject.tag == "Player")
          {
               Vector3 damageDirection = other.transform.position - transform.position;
               damageDirection = damageDirection.normalized;
               //check if you already started the contact before, otherwise start
               if (!damager)
                     StartCoroutine(CountDown());
          }
  }

  IEnumerator CountDown()
  {
      print(Time.time);
      //apply damage inside the coroutine
     while (true){
          healthScript.DamagePlayer(Pain, damageDirection);
           yield return new WaitForSeconds(1000);
      }
      print(Time.time);
  }

if you want the script apply a bit more of time damage after contact replace the while(true) by a for loop, on the other hand. if you want to stop imediately the contact ends stop it with OnTriggerExit

    void OnTriggerExit (Collider other) { 
         
         StopCoroutine(damager);
         damager = null;
    }

and last, if you want to apply acid by any of enemy or other players you will need to use the collider that you hit

  void OnTriggerStay (Collider other) { 

          if (other.gameObject.tag == "Player")
          {
                healthScript = other.transform.GetComponent<PlayerHealth>();
                ...

  IEnumerator CountDown()
  {
     while (true){
          //check to be sure
          if(healthScript)
               healthScript.DamagePlayer(Pain, damageDirection);
          ...

avatar image TreyH DCordoba · Feb 19, 2019 at 02:52 PM 0
Share

Yeah, @DanProd if you're using some Unity function that starts with Find__, that's typically something that should either be cached in Start (or Awake) or just supplied in the Inspector.

2 Replies

· Add your reply
  • Sort: 
avatar image
0
Best Answer

Answer by TreyH · Feb 19, 2019 at 01:51 PM

I don't think you need a Coroutine at all:

 private float hitLast = 0;
 private float hitDelay = 5;
 void OnTriggerStay (Collider other)
 {
     if (other.gameObject.tag == "Player")
     {
         if (Time.time - hitLast < hitDelay)
             return;
 
         Vector3 damageDirection = other.transform.position - transform.position;
         damageDirection = damageDirection.normalized;
         FindObjectOfType<PlayerHealth> ().DamagePlayer (Pain, damageDirection);
 
         hitLast = Time.time;
     }
 }


Comment
Add comment · Show 6 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image zereda-games · Feb 19, 2019 at 01:52 PM 0
Share

that may be, but in his script he is waiting for 1000 seconds not 1!

avatar image TreyH zereda-games · Feb 19, 2019 at 02:45 PM 0
Share

"I want to tell the script that it should be waiting like 5 seconds before damaging again"

His post says that he wants to wait 5 seconds and seems to be confused about how to implement that. With that in $$anonymous$$d, the the ti$$anonymous$$g portion of his code should be disregarded, I think.

avatar image zereda-games TreyH · Feb 19, 2019 at 05:18 PM 0
Share

fair enough, comment is hear mainly because i don't think he understands what 1 second is by this post.

avatar image bpaynom · Feb 19, 2019 at 02:30 PM 0
Share

I prefer to do the operation once, and not everytime I check it.

 if ( Time.time < nextHit )
      return;
 
 nextHit = Time.time + hitDelay;


avatar image TreyH bpaynom · Feb 19, 2019 at 02:49 PM 0
Share

They're equivalent, but whatever's more readable for the author / $$anonymous$$m is the ideal syntax yeah.

avatar image DanProd · Feb 19, 2019 at 11:12 PM 0
Share

Thank you!

avatar image
0

Answer by visca_c · Feb 19, 2019 at 03:01 PM

put the damage function in coroutine too, or else they would execute together without delay. Something like this: (Edit: if you want to use OnTriggerStay, you probably want to make sure you are not starting co-routine every frame when player is in trigger.)

  bool coroutineRunning;
  IEnumerator DmgAfterTime(float seconds)
  {
      coroutineRunning=true;
      yield return new WaitForSeconds(seconds);
      playerHealth.DamagePlayer (Pain, damageDirection);
      coroutineRunning=false;
  }

 void OnTriggerStay(Collider other)
 {
         //if not running
         if(!coroutineRunning)
         StartCoroutine(DmgAfterTime(5));
 
 }

Another way to run function after time is to use delegate in a cotoutine.

 public delegate void RunFuncDelegate();
 public IEnumerator RunFuncAfterTime(RunFuncDelegate Func, float time)
 {
     yield return new WaitForSecondsRealtime(time);
     Func();
 }

This way you can call any function after a delay.

 StartCoroutine(RunFuncAfterTime(() =>  playerHealth.DamagePlayer (Pain, damageDirection), 5));



Comment
Add comment · Show 5 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image DCordoba · Feb 19, 2019 at 03:16 PM 0
Share

thats not the only problem, he is calling a new corroutine each OnTriggerStay...

talking about call functions on delegate he ca also use built in InvokeRepeating

avatar image visca_c · Feb 19, 2019 at 05:18 PM 0
Share

oh ya, missed the OnTriggerStay. Thanks for pointing out. I didn't know about Invoke before, just read about them now, why did Unity make Invoke takes in string as argument though? I can't mass-rename the function name that way.

avatar image zereda-games visca_c · Feb 20, 2019 at 12:23 AM 0
Share

I think it makes it dynamic or something i was reading?? *Do correct me if im wrong because i don't fully understand dynamics*What i understand is, with strings they can be passed through a server where i don't think you can be near as specific with int's if at all.

avatar image zereda-games · Feb 19, 2019 at 05:20 PM 0
Share

I was going to say this hours ago but wasn't 100% sure so i held off as i didn't know if it was necessary or not.

avatar image DanProd · Feb 19, 2019 at 11:12 PM 0
Share

Thanks for that answer too!

Your answer

Hint: You can notify a user about this post by typing @username

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

Answers Answers and Comments

600 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Error: CS0246 Can't access Player Health Script 1 Answer

Distribute terrain in zones 3 Answers

Cant Make C# Use waitforseconds Command 3 Answers

Pause a script completely 3 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges