Back to Hello Agents

🎮 赛博小镇 - GDScript脚本说明

code/chapter15/Helloagents-AI-Town/helloagents-ai-town/scripts/README.md

1.0.26.0 KB
Original Source

🎮 赛博小镇 - GDScript脚本说明

📁 脚本文件列表

scripts/
├── config.gd          # 全局配置
├── api_client.gd      # API通信客户端
├── player.gd          # 玩家控制
├── npc.gd            # NPC行为
├── dialogue_ui.gd    # 对话UI
└── main.gd           # 主场景逻辑

📄 脚本详解

1. config.gd (全局配置)

用途: 存储全局常量和配置

关键配置:

gdscript
const API_BASE_URL = "http://localhost:8000"  # 后端API地址
const PLAYER_SPEED = 200.0                     # 玩家速度
const NPC_STATUS_UPDATE_INTERVAL = 30.0        # NPC更新间隔

使用方法:

gdscript
# 在任何脚本中访问
Config.log_info("消息")
var speed = Config.PLAYER_SPEED

2. api_client.gd (API客户端)

用途: 与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状态

使用示例:

gdscript
# 获取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)

3. player.gd (玩家控制)

用途: 处理玩家移动和交互

关键功能:

  • WASD/方向键移动
  • E键与NPC交互
  • 检测附近的NPC

节点要求:

Player (CharacterBody2D)
├── Sprite2D
├── CollisionShape2D
└── Camera2D

自定义参数:

gdscript
@export var speed: float = 200.0  # 在Inspector中可调整

4. npc.gd (NPC行为)

用途: NPC交互和状态显示

关键功能:

  • 检测玩家进入/离开交互范围
  • 显示NPC名字和对话
  • 更新NPC状态

节点要求:

NPC (Node2D)
├── Sprite2D
├── InteractionArea (Area2D)
│   └── CollisionShape2D
├── NameLabel (Label)
└── DialogueLabel (Label)

导出参数:

gdscript
@export var npc_name: String = "张三"
@export var npc_title: String = "Python工程师"

使用方法:

  1. 在Inspector中设置NPC名字和职位
  2. 脚本会自动处理交互逻辑

5. dialogue_ui.gd (对话UI)

用途: 对话界面管理

关键功能:

  • 显示/隐藏对话框
  • 处理玩家输入
  • 显示对话历史
  • 与API通信

节点要求:

DialogueUI (CanvasLayer)
└── Panel
    ├── NPCName (Label)
    ├── NPCTitle (Label)
    ├── DialogueText (RichTextLabel)
    ├── PlayerInput (LineEdit)
    ├── SendButton (Button)
    └── CloseButton (Button)

使用方法:

gdscript
# 开始对话
get_tree().call_group("dialogue_system", "start_dialogue", "张三")

6. main.gd (主场景)

用途: 管理整个游戏场景

关键功能:

  • 定时更新NPC状态
  • 分发NPC对话到各个NPC节点
  • 协调各个系统

节点要求:

Main (Node2D)
├── TileMapLayer (地图)
├── Player (实例化)
├── NPCs (Node2D)
│   ├── NPC_Zhang (实例化)
│   ├── NPC_Li (实例化)
│   └── NPC_Wang (实例化)
└── DialogueUI (实例化)

🔧 如何使用这些脚本

步骤1: 设置AutoLoad

Project -> Project Settings -> AutoLoad 中添加:

  • config.gd -> 名称: Config
  • api_client.gd -> 名称: APIClient

步骤2: 附加脚本到场景

  • player.tscn -> 附加 player.gd
  • npc.tscn -> 附加 npc.gd
  • dialogue_ui.tscn -> 附加 dialogue_ui.gd
  • main.tscn -> 附加 main.gd

步骤3: 配置节点

确保每个场景的节点结构与脚本要求一致。

步骤4: 设置参数

在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 中:

gdscript
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回复

🎯 扩展建议

添加新NPC

  1. main.tscn 中实例化 npc.tscn
  2. 设置NPC名字和位置
  3. main.gdget_npc_node() 中添加映射

添加新功能

  1. config.gd 中添加配置
  2. api_client.gd 中添加新API方法
  3. 在相应脚本中实现逻辑

优化性能

  1. 减少 NPC_STATUS_UPDATE_INTERVAL 的更新频率
  2. 使用对象池管理UI元素
  3. 优化TileMap的碰撞层

📚 参考资源


❓ 常见问题

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