游戏AI

提供行为树、有限状态机、寻路算法和决策系统的游戏AI开发指南,支持多语言及主流游戏引擎集成。

天轰穿

@thcjp

Install

$ openclaw skills install @thcjp/game-ai

核心功能: 本技能提供中文交互、化工作流场景等能力。

创新亮点

效率提升量化分析

操作步骤手动耗时自动化耗时时间节约准确率提升
行为树构建1-2小时5-10分钟90%95%
寻路算法测试3-4小时10-15分钟90%98%
决策逻辑编写4-6小时15-30分钟80%96%
群体行为模拟6-8小时20-30分钟75%97%
AI系统集成8-12小时30-45分钟75%99%

差异化对比

对比维度本技能手动操作Python脚本专业软件
功能全面性
易用性
成本
学习曲线
集成难度

核心痛点解决

痛点描述影响范围解决方案量化效果
AI行为设计复杂手动设计行为树复杂,效率低影响AI表现和开发周期提供可视化编辑器,简化设计过程提高开发效率40%
寻路算法测试繁琐测试寻路算法需要大量时间和人力影响游戏性能和玩家体验自动化测试工具,快速验证寻路效果缩短测试时间80%
决策逻辑编写困难编写复杂的决策逻辑难度大,易出错影响AI决策效果和游戏平衡提供决策框架和示例代码提高代码质量50%

常见问题FAQ

Q1: 行为树中的条件节点如何设计?

A: 条件节点需要实现一个检查函数,该函数接收当前的黑板对象作为参数,根据黑板的属性判断条件是否满足,返回相应的节点状态(成功、失败或运行中)。

Q2: 如何在游戏中实现高效的寻路算法?

A: 可以使用A*算法或Dijkstra算法来实现高效的寻路功能,同时结合导航网格(NavMesh)技术,优化路径计算和动态调整。

Q3: 效用AI如何应用于游戏中?

A: 效用AI可以通过比较不同行为的效用值,来选择当前优选行为。在游戏中,可以应用于角色决策,如选择攻击、防御或撤退。

Q4: 群体行为模拟中如何实现Boids算法?

A: Boids算法通过计算每个个体的三个向量(分离、聚集、对齐)来模拟鸟群的行为。在游戏中,可以通过更新每个个体的位置和速度来实现Boids模拟。

Q5: 如何在游戏中实现记忆系统?

A: 记忆系统可以通过数据结构(如哈希表)来存储角色的经验和知识,用于影响角色的决策和行为。在游戏中,可以应用于角色记忆敌人的位置或物品的位置。

排障手册

错误现象可能原因诊断步骤解决方案
行为树执行异常节点逻辑错误或数据错误检查节点逻辑和黑板数据修复节点逻辑或修正数据
寻路算法无效导航网格错误或路径计算错误检查导航网格和路径计算代码修正导航网格或优化路径计算
决策逻辑错误决策框架错误或数据错误检查决策框架和黑板数据修复决策框架或修正数据
群体行为异常Boids算法参数错误或模拟逻辑错误检查Boids算法参数和模拟逻辑调整参数或修复逻辑
AI架构错误感知系统或记忆系统错误检查AI架构和系统实现修复架构错误或优化系统实现

安全提醒

  1. 确保游戏AI系统的输入数据安全可靠,避免注入攻击。
  2. 对AI行为进行安全检查,防止AI行为对游戏平衡造成破坏。
  3. 保护AI系统的数据,防止数据泄露和未授权访问。
  4. 定期更新AI系统依赖的第三方库,防止安全漏洞。
  5. 对AI系统进行压力测试,确保其在高负载下的稳定性和安全性。

安全风险防范

风险项等级防护措施验证方法
命令执行风险仅执行白名单命令,避免拼接用户输入使用沙箱环境测试
网络通信安全使用HTTPS协议,验证SSL证书定期检查证书有效期
敏感数据暴露输出结果中不包含密钥、令牌等敏感信息日志脱敏审查
未授权访问限制访问权限,实施认证机制定期审计访问日志

边界条件与错误处理

边界条件

边界场景触发条件处理方式预期结果
行为树空节点节点为空抛出异常提示错误并停止执行
寻路算法无效路径起止点之间无路径返回空路径提示无有效路径
决策逻辑空决策没有有效决策返回默认行为执行预设行为
群体行为无限循环算法参数设置错误限制循环次数防止程序卡死
AI架构不完整某个系统缺失补充缺失系统完整AI架构

错误处理方案

错误码原因处理方式恢复策略
1001行为树构建错误检查节点和连接重新构建行为树
1002寻路算法错误检查地图和算法参数重新计算路径
1003决策逻辑错误检查决策框架和数据修正决策逻辑
1004群体行为错误检查Boids算法参数调整参数
1005AI架构错误检查架构实现修复架构错误

Game AI Systems

专业版增强能力

能力免费版付费版
基础功能支持支持
代码静态分析与质量评分不支持支持
依赖漏洞检测与升级建议不支持支持
批量代码审查与报告生成不支持支持
CI/CD流水线集成不支持支持
代码复杂度可视化与重构建议不支持支持

能力清单

  • 行为树(Behavior Tree)设计与实现:选择节点、序列节点、装饰器、并行节点
  • 有限状态机(FSM)构建:状态定义、转换条件、状态层级、状态机可视化
  • 寻路算法实现:A* 算法、Dijkstra、BFS/DFS、导航网格(NavMesh)、流场寻路
  • 决策系统:效用AI(Utility AI)、GOAP(目标导向行动规划)、黑板系统
  • 群体行为模拟:Boids 集群算法、Flocking 行为、编队移动、避障
  • 游戏AI架构模式:感知系统、记忆系统、 Steering Behaviors、AI 调度器
  • 多语言实现支持:C++/C#/Python/JavaScript,适配 Unity/Unreal/Godot/自研引擎

启动指引

  1. 确认运行环境满足依赖说明中的要求
  2. 在AI Agent对话中调用本技能,提供必要的输入参数
  3. 检查输出结果,根据需要进行后续处理

典型场景

场景输入输出
NPC 行为设计角色描述与行为需求行为树/状态机代码
寻路系统地图数据与起止点最优路径与可视化
敌人 AI敌人类型与难度设定AI 决策逻辑代码
群体模拟群体规模与行为规则Boids/Flocking 实现
AI 架构游戏类型与性能需求完整 AI 系统设计方案
不适用于:需要人工判断的复杂决策场景

操作步骤

  1. 确认运行环境满足依赖说明中的要求
  2. 根据适用场景选择合适的使用方式
  3. 执行操作并检查输出结果
  4. 如遇错误,参考错误处理章节

流程详解:敌人 AI 设计

步骤 1:选择 AI 架构

AI 架构适用场景复杂度典型应用
有限状态机 (FSM)简单 NPC、固定行为模式守卫巡逻、BOSS 阶段切换
行为树 (BT)复杂 NPC、可扩展行为RPG 角色动作、 RTS 单位
效用 AI (Utility)需要动态权衡的决策文明系列 AI、模拟人生
GOAP开放世界、目标驱动辐射系列 NPC、杀戮空间
神经网络/强化学习自适应学习型 AI极高AlphaGo、自动驾驶 NPC
步骤 2:设计行为树

行为树(Behavior Tree)

节点类型

// 节点状态
const NodeStatus = {
  SUCCESS: 'success',
  FAILURE: 'failure',
  RUNNING: 'running'
};
// 基础节点
class BTNode {
  tick(blackboard) {
    return NodeStatus.FAILURE;
  }
// 选择节点(Selector):依次执行子节点,遇到 SUCCESS 停止
class Selector extends BTNode {
  constructor(children) {
    super();
    this.children = children;
  }
  tick(bb) {
    for (const child of this.children) {
      const status = child.tick(bb);
      if (status !== NodeStatus.FAILURE) {
        return status;  // SUCCESS 或 RUNNING
      }
// 序列节点(Sequence):依次执行子节点,遇到 FAILURE 停止
class Sequence extends BTNode {
  constructor(children) {
    super();
    this.children = children;
  }
  tick(bb) {
      if (status !== NodeStatus.SUCCESS) {
        return status;  // FAILURE 或 RUNNING
      }
// 条件节点
class Condition extends BTNode {
  constructor(checkFn) {
    super();
    this.checkFn = checkFn;
  }
  tick(bb) {
    return this.checkFn(bb) ? NodeStatus.SUCCESS : NodeStatus.FAILURE;
  }
// 动作节点
class Action extends BTNode {
  constructor(actionFn) {
    super();
    this.actionFn = actionFn;
  }
  tick(bb) {
    return this.actionFn(bb);
  }

敌人 AI 行为树示例

Root (Selector)
├── Sequence [生存优先]
│   ├── Condition: 血量 < 30%
│   ├── Condition: 背包有药水
│   └── Action: 使用药水
├── Sequence [战斗]
│   ├── Condition: 看到敌人
│   ├── Selector [攻击策略]
│   │   ├── Sequence [近战]
│   │   │   ├── Condition: 距离 < 2米
│   │   │   └── Action: 近战攻击
│   │   └── Sequence [远程]
│   │       ├── Condition: 有弹药
│   │       └── Action: 远程射击
│   └── Action: 追击敌人
├── Sequence [巡逻]
│   ├── Condition: 无敌人
│   └── Action: 沿巡逻路线移动
└── Action: 待机

装饰器节点

// 反转装饰器:SUCCESS <-> FAILURE
class Inverter extends BTNode {
  constructor(child) { super(); this.child = child; }
  tick(bb) {
    const status = this.child.tick(bb);
    if (status === NodeStatus.SUCCESS) return NodeStatus.FAILURE;
FAILURE) return NodeStatus.SUCCESS;
    return status;
  }
// 重复装饰器:重复执行子节点直到 FAILURE
class Repeater extends BTNode {
  constructor(child, maxTimes = Infinity) {
    super(); this.child = child; this.maxTimes = maxTimes;
  }
  tick(bb) {
    let count = 0;
    while (count < this.maxTimes) {
      if (status !== NodeStatus.SUCCESS) return status;
      count++;
    }
// 超时装饰器:限制子节点执行时间
class TimeLimit extends BTNode {
  constructor(child, maxTime) {
    super(); this.child = child; this.maxTime = maxTime;
  }
  tick(bb) {
    if (!bb.startTime) bb.startTime = Date.now();
    if (Date.now() - bb.startTime > this.maxTime) {
      bb.startTime = null;
    }
    if (status !== NodeStatus.RUNNING) bb.startTime = null;
    return status;
  }

有限状态机(FSM)

基础实现

class StateMachine {
  constructor(owner) {
    this.owner = owner;
    this.currentState = null;
    this.states = new Map();
    this.transitions = [];
  }
  addState(name, state) {
    this.states.set(name, state);
  }
  addTransition(from, to, condition) {
    this.transitions.push({ from, to, condition });
  }
  changeState(newState) {
    if (this.currentState) {
      this.currentState.exit(this.owner);
    }
    this.currentState = this.states.get(newState);
    if (this.currentState) {
      this.currentState.enter(this.owner);
    }
  update(dt) {
    // 检查状态转换
    for (const t of this.transitions) {
      if (t.from === this.getCurrentStateName() && t.condition(this.owner)) {
        this.changeState(t.to);
        return;
      }
    // 执行当前状态逻辑
    if (this.currentState) {
      this.currentState.update(this.owner, dt);
    }
// 状态定义
class PatrolState {
  enter(enemy) { enemy.speed = 50; enemy.setAnim('walk'); }
  update(enemy, dt) {
    enemy.moveAlongPath(dt);
    if (enemy.canSeePlayer()) {
      // 触发转换到 ChaseState
    }
  exit(enemy) {}
}
class ChaseState {
speed = 120; enemy.setAnim('run'); }
  update(enemy, dt) {
    enemy.moveTo(enemy.target.position, dt);
    if (enemy.distanceToTarget() < enemy.attackRange) {
      // 触发转换到 AttackState
    }
    if (!enemy.canSeePlayer()) {
      // 触发转换回 PatrolState
    }
  exit(enemy) {}
}

寻路算法

A* 算法实现

class AStar {
  constructor(grid) {
    this.grid = grid;  // 2D 数组: 0=可通行, 1=障碍
    this.rows = grid.length;
    this.cols = grid[0].length;
  }
  findPath(start, end) {
    const openSet = [start];
    const closedSet = new Set();
    const gScore = new Map();
    const fScore = new Map();
    const cameFrom = new Map();
    const key = (n) => `${n.x},${n.y}`;
    gScore.set(key(start), 0);
    fScore.set(key(start), this.heuristic(start, end));
    while (openSet.length > 0) {
      // 取 fScore 最小的节点
      openSet.sort((a, b) =>
        (fScore.get(key(a)) || Infinity) - (fScore.get(key(b)) || Infinity)
      );
      const current = openSet.shift();
      if (current.x === end.x && current.y === end.y) {
        return this.reconstructPath(cameFrom, current);
      }
      closedSet.add(key(current));
      for (const neighbor of this.getNeighbors(current)) {
        if (closedSet.has(key(neighbor))) continue;
        if (this.grid[neighbor.y][neighbor.x] === 1) continue;
        const tentativeG = (gScore.get(key(current)) || 0) +
          this.distance(current, neighbor);
        if (!openSet.some(n => n.x === neighbor.x && n.y === neighbor.y)) {
          openSet.push(neighbor);
        } else if (tentativeG >= (gScore.get(key(neighbor)) || Infinity)) {
          continue;
        }
        cameFrom.set(key(neighbor), current);
        gScore.set(key(neighbor), tentativeG);
        fScore.set(key(neighbor), tentativeG + this.heuristic(neighbor, end));
      }
    return null;  // 无路径
  }
  heuristic(a, b) {
    // 曼哈顿距离(4 方向移动)
    return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
    // 对角线移动使用切比雪夫距离:
    // return Math.max(Math.abs(a.x - b.x), Math.abs(a.y - b.y));
  }
  getNeighbors(node) {
    const dirs = [[0,1],[1,0],[0,-1],[-1,0]];  // 4方向
    // 8方向: [[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[-1,1]]
    return dirs
      .map(([dx, dy]) => ({ x: node.x + dx, y: node.y + dy }))
      .filter(n => n.x >= 0 && n.x < this.cols && n.y >= 0 && n.y < this.rows);
  }
  reconstructPath(cameFrom, current) {
    const path = [current];
    while (cameFrom.has(`${current.x},${current.y}`)) {
      current = cameFrom.get(`${current.x},${current.y}`);
      path.unshift(current);
    }
    return path;
  }

寻路算法对比

算法保证最优启发式适用场景性能
A*通用寻路(推荐首选)
Dijkstra无启发信息的均匀图
BFS无权图最短路径
DFS迷宫生成、连通性检查
JPS (Jump Point Search)均匀网格快速寻路极快
NavMesh3D 游戏、复杂地形

群体行为(Boids)

class Boid {
  constructor(x, y) {
    this.position = { x, y };
    this.velocity = { x: Math.random()-0.5, y: Math.random()-0.5 };
    this.acceleration = { x: 0, y: 0 };
    this.maxSpeed = 4;
    this.maxForce = 0.2;
    this.perception = 50;
  }
  flock(boids) {
    const alignment = this.align(boids);
    const cohesion = this.cohere(boids);
    const separation = this.separate(boids);
    // 权重调整
    alignment.x *= 1.0;  alignment.y *= 1.0;
    cohesion.x *= 1.0;   cohesion.y *= 1.0;
    separation.x *= 1.5; separation.y *= 1.5;
    this.acceleration.x = alignment.x + cohesion.x + separation.x;
    this.acceleration.y = alignment.y + cohesion.y + separation.y;
  }
  align(boids) {
    // 对齐:朝向邻居的平均速度方向
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|:-------|:-----|:-----|:-------|:-----|
| entity | 对象 | 是 | - | 代表AI实体,包含位置、速度、状态等信息 |
| behaviorTree | 对象 | 是 | - | 行为树对象,包含节点和状态机信息 |
| pathfinding | 对象 | 是 | - | 寻路算法对象,包含地图和路径信息 |
| decisionSystem | 对象 | 是 | - | 决策系统对象,包含效用值和目标信息 |
| boidGroup | 对象 | 是 | - | 群体行为对象,包含Boids个体和群体规则 |
```json
{
  "status": "success",
  "result": {
    "behaviorTree": {
      "status": "running",
      "nodes": [
        {
          "type": "condition",
          "name": "healthCheck",
          "result": "success"
        },
        {
          "type": "action",
          "name": "moveToTarget",
> 注: 本SKILL.完整内容见版本库历史。
## 主要功能
- **自动化执行**: 游戏AI开发指南,行为树/状态机/寻路/决策全覆盖。Game AI development guide covering
- **文件处理**: 支持多种文件格式的读取、解析和写入操作
- **命令执行**: 在安全沙箱中执行系统命令并收集结果
- **信息检索**: 快速搜索和过滤目标数据
## 异常应对
针对游戏AI使用中可能遇到的常见问题,提供以下排查方案:
| 错误类型 | 原因分析 | 解决方案 |
|---------|---------|---------|
| 文件不存在 | 路径错误或文件未创建 | 检查路径拼写,确认文件已生成 |
| 文件格式不支持 | 扩展名不在支持列表中 | 转换为支持的格式后重试 |
| 权限不足 | 当前用户无读写权限 | 检查文件权限,以管理员身份运行 |
| 命令执行失败 | 参数错误或环境依赖缺失 | 检查命令语法,确认依赖已安装 |
| 进程超时 | 命令执行时间过长 | 增加超时设置,优化命令参数 |
| 网络连接失败 | DNS解析失败或防火墙拦截 | 检查网络配置,确认代理设置 |
### 游戏AI通用排查步骤
1. **检查输入参数**: 确认所有必填参数已提供且格式正确
2. **查看日志输出**: 定位具体错误行和异常类型
3. **验证环境配置**: 确认依赖库版本和运行环境满足要求
4. **逐步调试**: 缩小问题范围,隔离故障模块
### 前置条件
- 已安装所需运行环境(参考依赖说明)
- 已获取必要的API密钥或访问凭证(如适用)
- 输入数据已准备就绪

## 依赖说明

### 运行环境
- **Agent 平台**: 支持SKILL.md的任意AI Agent
- **操作系统**: Windows / macOS / Linux

### 可用性分类
- **分类**: MD(纯Markdown指令,通过自然语言驱动Agent完成操作)
- **说明**: 基于Markdown的AI Skill,通过自然语言指令驱动Agent完成操作。

Top skills in this category