Skip to main content
skill CX Codex

ai-behavior-trees-utility-ai — Claude Code skill: how to install

Builds a production behavior-tree runtime and Utility AI decision system for game NPCs. Best for moving beyond simple FSM logic in Unity or Godot projects.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill ai-behavior-trees-utility-ai -a claude-code
Open on GitHub

What ai-behavior-trees-utility-ai does

This skill guides the creation of a C# decision runtime combining Behavior Trees and Utility AI. It covers the Blackboard key-value store, composite nodes such as Selector and Sequence, and decorators like Cooldown or Inverter. For Utility AI, it provides consideration scoring with response curves like sigmoid or quadratic functions.

Every node returns a Status enum of Success, Failure, or Running. Conditions resolve immediately, while actions return Running across frames until completed. Re-ticking a running action directly from the root resets its progress; it must resume where it left off to avoid breaking NPC behavior. Code samples use Unity vector property names, so Godot C# projects must switch to Length() and Normalized().

This skill focuses on custom runtime code. For navigation mesh routing or choosing between FSM and steering, rely on game-ai. If you need Unreal Engine assets like BTTask and AIController, use unreal-behavior-trees instead.

What it helps with

  • build a behavior tree runtime with Blackboard and composable nodes
  • score NPC decisions with Utility AI response curves and hysteresis
  • create hybrid agents where BT leaves delegate actions to utility evaluators
  • implement Selector and Sequence composites that preserve Running state

Example prompts for the agent

  • Help me build a C# Behavior Tree runtime with Selector, Sequence, and a Blackboard
  • Write a Utility AI action scorer evaluating distance and health with a sigmoid curve
  • Create a hybrid NPC decision setup where a BT leaf queries a utility evaluator

How to install ai-behavior-trees-utility-ai

1Skills CLI (Vercel)

npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill ai-behavior-trees-utility-ai -a claude-code

2Manually: put the files in place

~/.claude/skills/ai-behavior-trees-utility-ai/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/ai-behavior-trees-utility-ai/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about ai-behavior-trees-utility-ai

How to install ai-behavior-trees-utility-ai in Claude Code?

Run npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill ai-behavior-trees-utility-ai -a claude-code.

What does ai-behavior-trees-utility-ai do?

It generates architecture and code for Behavior Trees and Utility AI systems. You get reusable components for Blackboard, composite nodes, and action evaluation curves.

Can I use this skill for Unreal Engine behavior trees?

No, Unreal's built-in BehaviorTree and Blackboard asset workflow is covered by unreal-behavior-trees. This skill is designed for custom C# runtimes in engines like Unity or Godot.

Source text

SKILL.md · Apache-2.0
---
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:

```mermaid
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:

```text
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:

```csharp
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
}
```

```csharp
// 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

```csharp
// 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.

© gamedev-skills · Apache-2.0 · gamedev-skills/awesome-gamedev-agent-skills

Similar skills

Everything for Game dev and 3D: Unity, Unreal, Godot, Blender →

From the same set77

unreal-behavior-trees Build NPC AI in Unreal Engine 5 with Behavior Trees and Blackboards. Use it for enemy logic, patrols, reactive branches, and custom BT nodes. CX Codex +1 5,200installs unreal-niagara Walks the agent through Niagara in Unreal Engine 5: system and emitter assets, module stacks in the spawn/update stages, effects spawned from Blueprint or C++. CX Codex +1 5,200installs unreal-enhanced-input Configures Unreal Engine 5 Enhanced Input assets, C++ bindings, and triggers. Useful when wiring movement, look, and jump controls or fixing input loss on clients. CX Codex +1 5,200installs love2d-core Sets up the foundational loop, delta-time motion, input, and screen stacks for LÖVE 11.5 in Lua. Fixes framerate-dependent movement and configuration mistakes. CX Codex +1 5,000installs roblox-ui A skill for building Roblox interfaces: ScreenGui lifecycle, responsive UDim2 layouts, gamepad and touch input. Useful when UI clips or resets on respawn. CX Codex +1 3,800installs roblox-studio-workflow A workflow skill for editing existing Roblox Studio projects, from inspecting the project tree to Studio testing and removing temporary test objects. CX Codex +1 3,700installs roblox-networking A skill for designing and hardening Roblox client/server networking: RemoteEvent, RemoteFunction, UnreliableRemoteEvent, validation and rate limits. CX Codex +1 3,500installs roblox-characters Keeps Roblox character code working across respawns, so scripts stop holding stale Humanoid and root references. CX Codex +1 3,600installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor