从0到1开发goa/goap自定义Action:以ChopTreeAction为例的完整教程 从0到1开发goa/goap自定义Action以ChopTreeAction为例的完整教程【免费下载链接】goapGoal Oriented Action Planning AI in Unity项目地址: https://gitcode.com/gh_mirrors/goa/goapgoa/goap是一个基于Unity的Goal Oriented Action PlanningGOAPAI系统它允许开发者为游戏角色创建智能决策逻辑。本文将以ChopTreeAction为例详细介绍如何从零开始开发自定义Action帮助新手快速掌握GOAP系统的核心开发技能。什么是GOAP ActionGOAP Action是GOAP系统的核心组成部分它定义了智能体可以执行的具体行为。每个Action包含前置条件、执行效果、目标对象和执行逻辑等关键要素。在goa/goap项目中所有Action都继承自抽象基类GoapAction该类位于Assets/Standard Assets/Scripts/AI/GOAP/GoapAction.cs。GoapAction基类定义了以下必须实现的抽象方法reset()重置Action状态isDone()检查Action是否完成checkProceduralPrecondition()检查过程性前置条件perform()执行Action逻辑requiresInRange()是否需要靠近目标对象开发ChopTreeAction的完整步骤1. 创建Action类并继承GoapAction首先创建一个名为ChopTreeAction的类并继承GoapAction。在goa/goap项目中所有自定义Action都存放在Assets/Standard Assets/Scripts/GameData/Actions/目录下。public class ChopTreeAction : GoapAction { // 实现抽象方法和自定义逻辑 }2. 定义Action的状态变量在ChopTreeAction中我们需要定义一些状态变量来跟踪砍树过程private bool chopped false; private TreeComponent targetTree; // 目标树组件 private float startTime 0; public float workDuration 2; // 砍树所需时间秒3. 实现构造函数和前置条件/效果在构造函数中我们需要设置Action的前置条件和执行效果。对于砍树动作前置条件是拥有工具且没有木材执行效果是获得木材public ChopTreeAction() { addPrecondition(hasTool, true); // 需要工具 addPrecondition(hasLogs, false); // 没有木材 addEffect(hasLogs, true); // 获得木材 }4. 实现reset()方法reset()方法用于重置Action的状态在每次Action被规划时都会调用public override void reset() { chopped false; targetTree null; startTime 0; }5. 实现isDone()方法isDone()方法检查Action是否完成这里我们通过chopped变量来判断public override bool isDone() { return chopped; }6. 实现requiresInRange()方法砍树动作需要靠近树木因此requiresInRange()应返回truepublic override bool requiresInRange() { return true; // 需要靠近树木 }7. 实现checkProceduralPrecondition()方法该方法用于查找合适的目标对象这里是树木。我们需要找到距离智能体最近的树木public override bool checkProceduralPrecondition(GameObject agent) { // 查找所有树木组件 TreeComponent[] trees (TreeComponent[])UnityEngine.GameObject.FindObjectsOfType(typeof(TreeComponent)); TreeComponent closest null; float closestDist 0; foreach (TreeComponent tree in trees) { if (closest null) { closest tree; closestDist (tree.gameObject.transform.position - agent.transform.position).magnitude; } else { float dist (tree.gameObject.transform.position - agent.transform.position).magnitude; if (dist closestDist) { closest tree; closestDist dist; } } } if (closest null) return false; targetTree closest; target targetTree.gameObject; return closest ! null; }8. 实现perform()方法perform()方法包含Action的核心执行逻辑。在这里我们处理砍树过程、获取木材以及工具损耗public override bool perform(GameObject agent) { if (startTime 0) startTime Time.time; if (Time.time - startTime workDuration) { // 完成砍树获取木材 BackpackComponent backpack (BackpackComponent)agent.GetComponent(typeof(BackpackComponent)); backpack.numLogs 1; chopped true; // 使用工具并检查工具是否损坏 ToolComponent tool backpack.tool.GetComponent(typeof(ToolComponent)) as ToolComponent; tool.use(0.34f); if (tool.destroyed()) { Destroy(backpack.tool); backpack.tool null; } } return true; }将自定义Action添加到智能体要让智能体能够使用新创建的ChopTreeAction需要将其添加到相应的智能体组件中。以Logger伐木工人为例在Assets/Standard Assets/Scripts/GameData/Labourers/Logger.cs中ChopTreeAction被用于实现伐木目标。自定义Action开发最佳实践保持单一职责每个Action应只完成一个具体任务如砍树、采矿、锻造等合理设置前置条件和效果确保条件和效果的逻辑一致性这直接影响GOAP规划器的决策优化目标选择在checkProceduralPrecondition()中高效查找目标避免性能问题处理资源消耗如工具损耗、时间成本等使AI行为更真实状态重置在reset()方法中确保所有状态变量都被正确重置总结通过本文的教程你已经了解了如何基于goa/goap项目开发自定义Action。从继承GoapAction基类到实现各种抽象方法再到定义具体的执行逻辑每个步骤都至关重要。掌握Action开发是构建复杂GOAP AI系统的基础希望这个以ChopTreeAction为例的教程能帮助你快速上手goa/goap的开发。现在你可以尝试开发其他类型的Action如采矿MineOreAction、锻造工具ForgeToolAction等这些Action都可以在Assets/Standard Assets/Scripts/GameData/Actions/目录下找到参考实现。【免费下载链接】goapGoal Oriented Action Planning AI in Unity项目地址: https://gitcode.com/gh_mirrors/goa/goap创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/9/26 23:24:47
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/26 18:48:15
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/26 3:42:08
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/9/26 11:37:29
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 4:08:27
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/26 21:11:24

日新闻

周新闻