- Home /
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.
You could use my free State$$anonymous$$achine framework on http://unitygems.com or you could use a coroutine for simple cases or a behaviour controller. See my answer (about to post).
Answer by whydoidoit · Mar 23, 2013 at 11:04 PM
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.
Answer by Bunny83 · Mar 23, 2013 at 11:40 PM
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 ;)
Your answer

Follow this Question
Related Questions
Nearest Enemy To Team (Without Crowding!) 1 Answer
Behavior Tree Barebones Tutorial 5 Answers
Continual position error 0 Answers
Why does the script act completely wrong? 0 Answers
Controlling AI Movement 0 Answers