Utility Selector
Order children by utility
Utility Selector runs the available child with the highest GetUtility() value. It reevaluates available children every tick and interrupts the current child when a different child wins. After a child fails, it compares the remaining children again. Like a Selector, it succeeds when a child succeeds and fails when no available child remains.
Use it when changing needs such as safety, hunger, and fatigue must be compared on one scale. Make each task safe to interrupt. Use Priority Selector for startup-only calculated ordering, Selector Evaluator for fixed-priority reconsideration, or a Selector with Conditional Aborts for condition-driven interruptions.
Keep normalization and scoring rules outside the structural task so the tree remains readable.
Add a custom evaluator
Override GetUtility() in each child task and return larger values for more desirable branches. Expose the values used by that calculation as Shared Variables when designers need to tune them.