游戏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架构和系统实现 | 修复架构错误或优化系统实现 |
安全提醒
- 确保游戏AI系统的输入数据安全可靠,避免注入攻击。
- 对AI行为进行安全检查,防止AI行为对游戏平衡造成破坏。
- 保护AI系统的数据,防止数据泄露和未授权访问。
- 定期更新AI系统依赖的第三方库,防止安全漏洞。
- 对AI系统进行压力测试,确保其在高负载下的稳定性和安全性。
安全风险防范
| 风险项 | 等级 | 防护措施 | 验证方法 |
|---|---|---|---|
| 命令执行风险 | 高 | 仅执行白名单命令,避免拼接用户输入 | 使用沙箱环境测试 |
| 网络通信安全 | 中 | 使用HTTPS协议,验证SSL证书 | 定期检查证书有效期 |
| 敏感数据暴露 | 高 | 输出结果中不包含密钥、令牌等敏感信息 | 日志脱敏审查 |
| 未授权访问 | 中 | 限制访问权限,实施认证机制 | 定期审计访问日志 |
边界条件与错误处理
边界条件
| 边界场景 | 触发条件 | 处理方式 | 预期结果 |
|---|---|---|---|
| 行为树空节点 | 节点为空 | 抛出异常 | 提示错误并停止执行 |
| 寻路算法无效路径 | 起止点之间无路径 | 返回空路径 | 提示无有效路径 |
| 决策逻辑空决策 | 没有有效决策 | 返回默认行为 | 执行预设行为 |
| 群体行为无限循环 | 算法参数设置错误 | 限制循环次数 | 防止程序卡死 |
| AI架构不完整 | 某个系统缺失 | 补充缺失系统 | 完整AI架构 |
错误处理方案
| 错误码 | 原因 | 处理方式 | 恢复策略 |
|---|---|---|---|
| 1001 | 行为树构建错误 | 检查节点和连接 | 重新构建行为树 |
| 1002 | 寻路算法错误 | 检查地图和算法参数 | 重新计算路径 |
| 1003 | 决策逻辑错误 | 检查决策框架和数据 | 修正决策逻辑 |
| 1004 | 群体行为错误 | 检查Boids算法参数 | 调整参数 |
| 1005 | AI架构错误 | 检查架构实现 | 修复架构错误 |
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/自研引擎
启动指引
- 确认运行环境满足依赖说明中的要求
- 在AI Agent对话中调用本技能,提供必要的输入参数
- 检查输出结果,根据需要进行后续处理
典型场景
| 场景 | 输入 | 输出 |
|---|---|---|
| NPC 行为设计 | 角色描述与行为需求 | 行为树/状态机代码 |
| 寻路系统 | 地图数据与起止点 | 最优路径与可视化 |
| 敌人 AI | 敌人类型与难度设定 | AI 决策逻辑代码 |
| 群体模拟 | 群体规模与行为规则 | Boids/Flocking 实现 |
| AI 架构 | 游戏类型与性能需求 | 完整 AI 系统设计方案 |
| 不适用于:需要人工判断的复杂决策场景 |
操作步骤
- 确认运行环境满足依赖说明中的要求
- 根据适用场景选择合适的使用方式
- 执行操作并检查输出结果
- 如遇错误,参考错误处理章节
流程详解:敌人 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) | 是 | 是 | 均匀网格快速寻路 | 极快 |
| NavMesh | 是 | 是 | 3D 游戏、复杂地形 | 快 |
群体行为(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
Dashboard
@cellcogAI dashboard and web app generation powered by CellCog. Interactive dashboards, KPI trackers, data visualization, charts, analytics apps, data explorers, calculators, games. Responsive HTML apps with real-time filters.
Instagram Skill via cyberdrk/gram CLI
@areinInstagram CLI for viewing feeds, posts, profiles, and engagement via cookies.
Section 11: Endurance Training Coach (Intervals.icu)
@crankaddictEvidence-based endurance coaching protocol (v11.35). Use when analyzing training data, reviewing sessions, generating pre/post-workout reports, planning work...
Skill Vetter
@spclaudehomeSecurity-first skill vetting for AI agents. Use before installing any skill from ClawdHub, GitHub, or other sources. Checks for red flags, permission scope, and suspicious patterns.
Github
@steipeteInteract with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.