Skills gamedev-skills awesome-gamedev-agent-skills Gamedev Agent Skills

ai-behavior-trees-utility-ai

Use it when:
An enemy or NPC needs decisions beyond a simple state machine, and you want your own reusable decision code rather than an engine's built-in assets.
Behavior tree means:
A tree of conditions and actions checked each decision step, each node reporting success, failure or still running to its parent.
Utility AI means:
Scoring every possible action from 0 to 1 through response curves, then picking the best, so trade-offs such as distance against health are graded.
You get:
Plain C# runtime code: a blackboard (per-agent shared memory), composites, decorators, curves and an evaluator, plus guard, villager and hybrid agent templates.
Unlike its siblings:
The repo's game-ai helps choose between state machines, behavior trees, steering and pathfinding; unreal-behavior-trees is for Unreal's own tree assets.
Code examples:
C# using Unity's Vector2 member names, with the Godot C# equivalents named.

Skill 4 of 27 in the Gamedev Agent Skills bundle, after game-ai and before procedural-gen.

TL;DR

The implementation companion to the repo's game-ai skill: game-ai picks a decision model, this one builds it. Its workflow takes a behavior tree for structured, prioritized, interruptible behavior, utility scoring for continuous choices such as targeting, or both. It designs the blackboard first, so leaves share it and never reference each other; writes conditions that answer at once and actions that return Running across frames; and composes them with Selector (first child that doesn't fail wins), Sequence (stops at the first that doesn't succeed), Parallel and decorators such as Inverter, Cooldown and Repeat. For utility, each fact passes through a curve normalized to 0..1; the results combine as a weighted sum, or as a product with a compensation factor so each extra consideration doesn't drag the score toward zero; hysteresis keeps agents from flip-flopping on near-ties. It ticks once per decision step and has you draw the active path and scores on screen while tuning. Its pitfalls cover restarting a running action every frame, guard conditions that stop being checked once an action runs, cooldowns cleared when a branch is abandoned, and allocations every tick. Four reference files hold the full C# code, the templates and best practices.

Summarizes the skill at 19d93f9.

npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill ai-behavior-trees-utility-ai
Total Downloads
8,400 on skills.sh, Nov 9, 2026
Repo stars
7,863 gamedev-skills/awesome-gamedev-agent-skills
First seen
Aug 24, 2026 on skills.sh
Weekly Downloads
1.7K
+407% over the 8 weeks to Nov 9
Weekly values
Week toInstalls
Sep 21337
Sep 28398
Oct 5400
Oct 12485
Oct 19668
Oct 261,507
Nov 21,874
Nov 91,709
Category

Test-first work, implementation from specs, git hygiene and scope control.

Make games: design, genres, game feel and game-jam workflows, whatever the engine.

Everything for building software: planning, coding, debugging, design, frameworks, cloud, agents and skills.

Type

A multi-step process the agent follows: interview, debug, run a TDD loop, review.

Effect

Its own steps create or change files, git state or local tools.

Needs

Instructions only. Works in any agent that supports skills.

Publisher

Everyone else. Unverified vendor claims default to community.

Topics
Stack

SKILL.md

From gamedev-skills/awesome-gamedev-agent-skills at 19d93f9. Checked daily, last changed Nov 6, 2026.

Frontmatter
name: ai-behavior-trees-utility-ai
description: >
  Build a production behavior-tree runtime (Blackboard, action/condition leaves,
  sequence/selector/parallel composites, decorators) and a Utility AI system (response
  curves — linear, exponential, sigmoid, quadratic — considerations, and action evaluators),
  plus hybrid BT-drives-Utility agents. Use when implementing a reusable behavior-tree or
  utility-based decision system, or tuning enemy/NPC decisions beyond a simple FSM, or when
  the user mentions behavior tree, blackboard, decorator, selector, sequence, tick status,
  utility AI, response/scoring curve, or consideration. For choosing between FSM/BT/steering
  or for pathfinding, use game-ai; for Unreal's BehaviorTree/Blackboard assets, use
  unreal-behavior-trees.

Behavior Trees & Utility AI

Two complementary ways to structure NPC decision-making, plus how to combine them. A behavior tree (BT) expresses structured, prioritized, reactive logic as a tree that is "ticked" each step. Utility AI answers "how much do I want each option right now?" by scoring actions with normalized curves and picking the best. Ship believable agents by using a BT for structure and Utility AI where graded trade-offs matter.

This skill is the implementation companion to game-ai (which helps you choose between FSM / BT / steering / pathfinding). Read game-ai to pick a model; read this to build the runtime.

When to use

  • Use to build a reusable BT runtime: a Blackboard, Node base, action/condition leaves, Sequence/Selector/Parallel composites, and decorators (Inverter, Cooldown, Repeat).
  • Use to build a Utility AI decider: response curves, considerations, and an evaluator that scores and selects actions (max, softmax, or weighted-random for variety).
  • Use to build hybrid AI — a BT whose leaf delegates the "which attack / which target" choice to a utility evaluator.

When not to use: to choose between FSM, BT, steering, or pathfinding, and for A*/navmesh routing, use game-ai. For Unreal's asset-based BehaviorTree/Blackboard, BTTask/BTService and AIController, use unreal-behavior-trees. For the navmesh agent that moves the NPC, use unity-navmesh or the engine's navigation node.

Core workflow

  1. Pick the model. Structured, prioritized, interruptible behavior → BT. Continuous "score every option" decisions (targeting, needs, item choice) → Utility. Both → hybrid.
  2. Design the Blackboard first. One typed key/value store per agent is the shared memory that decouples nodes; leaves read/write it and never hold references to each other.
  3. Write leaves. Conditions return Success/Failure immediately; actions return Running across frames until they finish. Keep leaves small and side-effect-explicit.
  4. Compose. Selector = OR/fallback (first non-failure wins); Sequence = AND (stop at first non-success); Parallel for concurrent branches. Wrap with decorators for policy (invert, cooldown, repeat, force-success).
  5. For Utility: enumerate considerations, map each raw fact through a normalized 0..1 curve, combine (weighted product with compensation, or weighted sum), then select the max — add hysteresis so agents don't flip-flop on ties.
  6. Tick deliberately. Tick the tree/evaluator once per decision step (often slower than render). Preserve Running state between ticks; verify by drawing the active path and the per-action scores on screen while tuning.

Architecture at a glance

A behavior tree evaluates top-down, left-to-right; each node returns a status up to its parent:

flowchart TD
    Root["Selector (root)"] --> Combat["Sequence: Combat"]
    Root --> Patrol["Action: Patrol"]
    Combat --> See["Condition: CanSeePlayer?"]
    Combat --> InRange{"Selector: Reach"}
    Combat --> Attack["Action: Attack (Running)"]
    InRange --> Close["Condition: InAttackRange?"]
    InRange --> MoveTo["Action: MoveToPlayer (Running)"]

Utility AI is a scoring pipeline — every candidate action is scored, then one is selected:

facts (distance, health, ammo…)
      │  each fact → a normalized 0..1 response curve (consideration)
      ▼
score(action) = weight · combine(consideration_1 … consideration_n)   # product+compensation or sum
      ▼
select: argmax  ·  or softmax / weighted-random for variety  ·  + hysteresis to avoid jitter

Status is a three-value enum shared by every node — this is the contract that makes the tree composable:

public enum Status { Success, Failure, Running }

public abstract class Node
{
    public abstract Status Tick(Blackboard bb, float dt);
    public virtual void Reset() { }   // called when a parent abandons this subtree
}
// Selector = fallback/OR: return the first child that is not Failure.
// `Current` (from Composite) remembers a Running child so the next tick resumes there.
public sealed class Selector : Composite
{
    public override Status Tick(Blackboard bb, float dt)
    {
        for (; Current < Children.Count; Current++)
        {
            var s = Children[Current].Tick(bb, dt);
            if (s == Status.Running) return Status.Running;            // resume here next tick
            if (s == Status.Success) { Current = 0; return Status.Success; }
        }
        Current = 0;
        return Status.Failure;                                         // every child failed
    }
}

The reciprocal Sequence (AND — stop at first non-Success), the reactive variants that let a higher-priority branch interrupt a running one, Parallel, the Blackboard, the leaf base classes, and every decorator are in references/behavior-tree-core.md. The leaves use Unity's Vector2 member names (magnitude, normalized, sqrMagnitude); in Godot C# use Length(), Normalized() and LengthSquared().

Utility scoring in one snippet

// A consideration maps one raw fact to 0..1 through a response curve.
float Score(Blackboard bb)
{
    float distance01 = Curves.InverseLerp01(bb.Get<float>("distToPlayer"), 20f, 2f); // near = 1
    float health01   = Curves.Sigmoid(bb.Get<float>("health01"), k: 8f, mid: 0.4f);  // hurt = low
    // A 0 in any factor still vetoes the action; compensation stops each extra
    // consideration from dragging every score toward 0. No allocation per call.
    return Curves.Compensate(distance01 * health01, count: 2);
}

The full curve library (linear, quadratic, exponential, logistic/sigmoid, smoothstep), the Consideration/UtilityAction types, and the UtilityEvaluator selection strategies are in references/utility-ai-system.md.

Pitfalls

  • Re-ticking a Running action from the root every frame restarts it. Return Running and resume where you left off; only Reset() a subtree when a parent actually abandons it.
  • Deep trees re-evaluated wholesale each tick waste time and cause thrash. Prefer shallow trees and conditional aborts (a higher-priority condition can interrupt a lower branch).
  • A guard condition stops being checked once the action after it is Running. A memory Sequence resumes at the running child, so [CanSeePlayer?, Chase] keeps chasing after sight is lost. Use a ReactiveSequence (re-checks from the first child each tick) or have the action itself fail when its blackboard input disappears.
  • A cooldown that clears on Reset() lets an agent bypass it by flickering between branches. Keep the ready-time when the branch is aborted.
  • Un-normalized considerations. If one curve outputs 0..100 and another 0..1, the big one dominates. Every consideration must return 0..1.
  • Utility jitter on near-ties. Add hysteresis: give the currently-running action a small bonus so the agent commits instead of oscillating.
  • Allocating nodes, closures, or arrays every tick creates GC spikes. Build the tree once at spawn; keep per-tick work allocation-free.

References

  • references/behavior-tree-core.md — Blackboard, Node/leaf base classes, action & condition leaves, Sequence/Selector/Parallel, and the decorator library (full C#).
  • references/utility-ai-system.md — response-curve library, Consideration, UtilityAction, and the UtilityEvaluator (argmax, softmax, weighted-random, hysteresis).
  • references/practical-examples.md — a guard Patrol→Combat BT, a villager needs-based Utility AI, and a hybrid agent, as drop-in templates.
  • references/best-practices-and-pitfalls.md — memory management, profiling, avoiding deep trees, event-driven aborts, and combining Utility AI with BTs (hybrid architecture).

Related skills

  • game-ai — choose between FSM / BT / steering; A* and navmesh pathfinding.
  • unreal-behavior-trees — Unreal's asset-based BT/Blackboard, tasks, decorators, services.
  • unity-navmesh — the NavMeshAgent that carries out "move to" intents.
  • physics-tuning — agent radius, movement, and collision response for the motion layer.
  • tower-defense, fps-shooter, rpg — genres that compose this decision layer.