code/chapter15/Helloagents-AI-Town/helloagents-ai-town/scripts/README.md
scripts/
├── config.gd # 全局配置
├── api_client.gd # API通信客户端
├── player.gd # 玩家控制
├── npc.gd # NPC行为
├── dialogue_ui.gd # 对话UI
└── main.gd # 主场景逻辑
用途: 存储全局常量和配置
关键配置:
const API_BASE_URL = "http://localhost:8000" # 后端API地址
const PLAYER_SPEED = 200.0 # 玩家速度
const NPC_STATUS_UPDATE_INTERVAL = 30.0 # NPC更新间隔
使用方法:
# 在任何脚本中访问
Config.log_info("消息")
var speed = Config.PLAYER_SPEED
用途: 与FastAPI后端通信
主要方法:
send_chat(npc_name, message) - 发送对话get_npc_status() - 获取NPC状态get_npc_list() - 获取NPC列表信号:
chat_response_received(npc_name, message) - 收到对话回复chat_error(error_message) - 对话错误npc_status_received(dialogues) - 收到NPC状态使用示例:
# 获取API客户端
var api = get_node("/root/APIClient")
# 发送对话
api.send_chat("张三", "你好")
# 监听回复
api.chat_response_received.connect(_on_response)
func _on_response(npc_name, message):
print(npc_name + ": " + message)
用途: 处理玩家移动和交互
关键功能:
节点要求:
Player (CharacterBody2D)
├── Sprite2D
├── CollisionShape2D
└── Camera2D
自定义参数:
@export var speed: float = 200.0 # 在Inspector中可调整
用途: NPC交互和状态显示
关键功能:
节点要求:
NPC (Node2D)
├── Sprite2D
├── InteractionArea (Area2D)
│ └── CollisionShape2D
├── NameLabel (Label)
└── DialogueLabel (Label)
导出参数:
@export var npc_name: String = "张三"
@export var npc_title: String = "Python工程师"
使用方法:
用途: 对话界面管理
关键功能:
节点要求:
DialogueUI (CanvasLayer)
└── Panel
├── NPCName (Label)
├── NPCTitle (Label)
├── DialogueText (RichTextLabel)
├── PlayerInput (LineEdit)
├── SendButton (Button)
└── CloseButton (Button)
使用方法:
# 开始对话
get_tree().call_group("dialogue_system", "start_dialogue", "张三")
用途: 管理整个游戏场景
关键功能:
节点要求:
Main (Node2D)
├── TileMapLayer (地图)
├── Player (实例化)
├── NPCs (Node2D)
│ ├── NPC_Zhang (实例化)
│ ├── NPC_Li (实例化)
│ └── NPC_Wang (实例化)
└── DialogueUI (实例化)
在 Project -> Project Settings -> AutoLoad 中添加:
config.gd -> 名称: Configapi_client.gd -> 名称: APIClientplayer.tscn -> 附加 player.gdnpc.tscn -> 附加 npc.gddialogue_ui.tscn -> 附加 dialogue_ui.gdmain.tscn -> 附加 main.gd确保每个场景的节点结构与脚本要求一致。
在Inspector中设置导出参数(如NPC名字、速度等)。
所有脚本都使用 Config.log_info() 输出日志,在Godot的 Output 面板查看。
[INFO] API客户端初始化完成
[INFO] 玩家初始化完成
[INFO] NPC初始化: 张三
[INFO] 进入NPC范围: 张三
[API] POST /chat -> {"npc_name":"张三","message":"你好"}
[INFO] 收到NPC回复: 张三 -> 你好!我是Python工程师...
在 config.gd 中:
const DEBUG_MODE = true # 显示详细日志
const SHOW_INTERACTION_RANGE = true # 显示交互范围
玩家按E键
↓
player.gd: interact_with_npc()
↓
发送信号到 dialogue_system 组
↓
dialogue_ui.gd: start_dialogue(npc_name)
↓
显示对话框,玩家输入消息
↓
dialogue_ui.gd: send_message()
↓
api_client.gd: send_chat(npc_name, message)
↓
HTTP请求到FastAPI后端
↓
api_client.gd: _on_chat_request_completed()
↓
发出信号: chat_response_received
↓
dialogue_ui.gd: _on_chat_response_received()
↓
显示NPC回复
main.tscn 中实例化 npc.tscnmain.gd 的 get_npc_node() 中添加映射config.gd 中添加配置api_client.gd 中添加新API方法NPC_STATUS_UPDATE_INTERVAL 的更新频率Q: 如何修改API地址?
A: 编辑 config.gd 中的 API_BASE_URL
Q: 如何添加更多NPC?
A: 实例化 npc.tscn,设置参数,在 main.gd 中添加引用
Q: 如何自定义对话框样式?
A: 编辑 dialogue_ui.tscn,修改Panel和Label的主题
Q: 如何禁用调试日志?
A: 在 config.gd 中设置 DEBUG_MODE = false