Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 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
1
Question by Spankenstein · Jan 21, 2014 at 07:07 PM · listcoroutineserializationtiming

Executing a list of coroutines at specific times

I would like to be able to execute a list of coroutines at specific times and allow this list to be serialized.

To implement this I thought that I would create a base "Script" class:

 public abstract class Script
 {
     IEnumerator action;
     float time;
 
     public Script(ScriptSettings settings)
     {
         time = settings.Time;
     }
 
     public void Execute()
     {
         float elapsedTime = time - Time.time;
 
         // Check to see if the script has expired
         if (elapsedTime < 0)
         {
             return;
         }
 
         OnExecute(elapsedTime);
     }
 
     protected abstract void OnExecute(float elapsedTime);
 }

The derived classes would then have the specific coroutine or "action" which would be called from Execute:

 public class Fire : Script
 {
     IEnumerator action;
     float time;
 
     public Fire(ScriptSettings settings)
         : base(settings)
     {
 
     }
 
     protected override void OnExecute(float elapsedTime)
     {
         StartCoroutine(Firing(elapsedTime));        // Can't use this function outside of a MonoBehaviour derived class
     }
 
     IEnumerator Firing(float startTime)
     {
         yield return new WaitForSeconds(startTime);
 
         // Fire
         Debug.Log("Fire " + Time.time);
     }
 }

This method fails to work as I can't derive from both MonoBehaviour and Script.

What methods do you guys use for executing a list of coroutines at specific times?

It would normally seem straightforward but I will need to serialize each type of coroutine and the time at which it will execute. The time part is easy but I thought the coroutine will require a specific class to which it is associated?

Comment
Add comment
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

1 Reply

· Add your reply
  • Sort: 
avatar image
1

Answer by dscroggi · Jan 21, 2014 at 11:57 PM

Hmm how about a timer script with a public static method that can register your coroutines and call from your OnExecute?

 using System;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class Timer : MonoBehaviour 
 {
     private static Dictionary<Action, float> timers = new Dictionary<Action, float>();
 
     public static void Set(Delegate callback, float duration, float delay = 0, params object[] parameters)
     {
         if(delay > 0)
         {
             timers.Add(() => timers.Add(() => callback.DynamicInvoke(parameters), duration), delay);
         }
         else
         {
             timers.Add(() => callback.DynamicInvoke(parameters), duration);
         }
     }
 
     private void Update()
     {
         foreach (KeyValuePair<Action, float> timer in timers)
         {
             if(timer.Value >= 0)
             {
                 timers.Remove(timer.Key);
                 timer.Key();
             }
             else
             {
                 timers[timer.Key] -= Time.deltaTime;
             }
         }
     }
 }
Comment
Add comment · Show 1 · 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 Spankenstein · Jan 22, 2014 at 10:05 AM 1
Share

Looking good. I was hoping to avoid accumulating time each update by setting WaitForSeconds in a Coroutine but this is certainly useful. Thank you.

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

19 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

Related Questions

A node in a childnode? 1 Answer

Difference between assigning a value in inspector and with a custom editor script 1 Answer

Problems in a footstep coroutine 1 Answer

What is the best method to have a list of references to other scripts? 0 Answers

How do I make child classes in a list editable from the Inspector? 1 Answer


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