Best behavior scheduling method

What is the best way of linking behaviors into arbitrary chains? For example, applying a force in every frame until the object reaches some point could be one behavior, then doing the same until a different point could be another one. There are no tools for this purpose on the asset store, at least no free ones.

Use a coroutine:

 Vector3 target;
 Vector3 targetRotation;
 Color targetColor;


  IEnumerator DoStuff()
  {
       var direction = (target - transform.position).normalized;
       float distance;
       //First move
       while((distance = Vector3.Distance(target, transform.position)) > 0.1f)
       {
           transform.position += direction * Mathf.Min(distance, Time.deltaTime);
           yield return null;
       }
       //Then rotate
       while(Vector3.Distance(targetRotation.eulerAngles, transform.eulerAngles) > 1f)
       {
           transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 2);
           yield return null;
       }
       //Then change the color
       var t = 0f;
       var original = renderer.material.color;
       while(t < 1)
       {
             renderer.material.color = Color.Lerp(original, targetColor, t);
             t += Time.deltaTime;
             yield return null;
       }
       renderer.material.color = targetColor;
       
  }

Or you could attach a behaviour that just does each individual action as a separate script to the game object and have another script enable them/disable them as appropriate.

Well, if you want to schedule arbitrary behaviours, i would do something like this:

//C#
public class ChainBehaviour : MonoBehaviour
{
    public virtual Coroutine StartAction()
    {
        return StartCoroutine(Action());
    }
    public virtual IEnumerator Action()
    {
        yield break;
    }
}

public class AddForceUntilPositionReached : ChainBehaviour
{
    public override IEnumerator Action()
    {
        while(position not reached)
        {
            AddForce
            yield return null;
        }
    }
}

public class ChainManager : ChainBehaviour
{
    public ChainBehaviour[] behaviours; // assign in inspector
    
    public override IEnumerator Action()
    {
        foreach(var B in behaviours)
        {
            yield return B.StartAction();
        }
    }
}

Now you can create as many script you want, just derive them from ChainBehaviour and override the “Action” coroutine. Just add them to the “behaviours” array on a ChainManager script. At some point just call StartAction() on the manager and it will run the tasks in the specified order. You can even cascade managers since it’s also a ChainBehaviour :wink: