这是塔塔给我写的启动文案

06/1046 浏览开发日记 包含 AI 合成内容
一直在采用启动文案的开发方式,但是过程中遇到了很多问题,这是目前的启动文案,感觉还算完善了吧,求大佬指点。

P1-T2 漂浮资源系统 — 开发对话文案

将以下内容粘贴到新对话中,让 AI 开发。
前置:P0(世界基底)+ P1-T1(玩家属性系统)必须已完成。
horizontal linehorizontal line

对话文案

我正在开发一个海岛生存游戏,P0 和 P1-T1 已完成,现在需要完成 P1-T2 漂浮资源系统,包含:通用交互系统、简易库存、漂浮物生成/漂流/拾取、资源面板UI。

现有项目结构

以下文件已存在,不要修改它们的核心逻辑:
scripts/
├── main.lua              -- 入口(需修改:集成新模块)
├── Config.lua            -- 全局配置(需修改:追加资源相关常量)
├── Player/
│   ├── Controller.lua    -- 角色控制器
│   ├── Stats.lua         -- 玩家属性系统
│   └── Death.lua         -- 死亡与复活
└── UI/
    ├── HUD.lua           -- HUD管理(需修改:新增交互按钮、资源面板)
    ├── StatsBar.lua      -- 属性条UI
    ├── PauseMenu.lua     -- 暂停菜单
    ├── Settings.lua      -- 设置界面
    └── Console.lua       -- 调试控制台
关键已有接口
  • Controller.GetNode() — 获取角色物理根节点
  • Controller.GetState() — 获取当前状态字符串
  • Death.SetKeepItems(bool) — 死亡是否保留物品
  • Death.GetKeepItems() — 查询保留物品设置
  • HUD.AddWidget(widget) — 动态添加 UI 元素
  • Config.SEA_LEVEL = 0.0 — 海面 Y 坐标
  • Config.ISLAND_POS = Vector3(0,0,0) — 岛中心位置
  • Config.ISLAND_SIZE_X = 6.0, ISLAND_SIZE_Z = 9.0 — 岛尺寸
  • 碰撞层:LAYER_GROUND=1, LAYER_PLAYER=2

需要新建的文件

scripts/
├── Interaction/
│   └── InteractionManager.lua  -- 通用交互系统
├── Resource/
│   └── Floating.lua            -- 漂浮资源生成、漂流、销毁
├── Player/
│   └── Inventory.lua           -- 简易库存(计数器方案)
└── UI/
    ├── InteractionUI.lua       -- 交互提示 + 手机端交互按钮
    └── ResourcePanel.lua       -- 资源面板(右上角)

Config.lua 需追加的常量

lua
-- 碰撞层 LAYER_INTERACTABLE = 3 -- 可交互物体层(漂浮物、设施等) -- 漂浮资源 FLOAT_SPAWN_RADIUS_MIN = 80 -- 生成区域内圈半径(米) FLOAT_SPAWN_RADIUS_MAX = 120 -- 生成区域外圈半径(米) FLOAT_SPAWN_INTERVAL_MIN = 10 -- 最短生成间隔(秒) FLOAT_SPAWN_INTERVAL_MAX = 20 -- 最长生成间隔(秒) FLOAT_SPAWN_GROUP_MIN = 1 -- 每组最少数量 FLOAT_SPAWN_GROUP_MAX = 3 -- 每组最多数量 FLOAT_MAX_COUNT = 15 -- 同时存在上限 FLOAT_DESPAWN_RADIUS = 150 -- 超出此半径销毁(米) FLOAT_DRIFT_SPEED_MIN = 0.5 -- 最小漂流速度(m/s) FLOAT_DRIFT_SPEED_MAX = 1.0 -- 最大漂流速度(m/s) FLOAT_BOB_AMPLITUDE = 0.1 -- 上下浮动幅度(米) FLOAT_BOB_PERIOD_MIN = 2.0 -- 浮动周期最短(秒) FLOAT_BOB_PERIOD_MAX = 3.0 -- 浮动周期最长(秒) -- 洋流 CURRENT_CYCLE_DURATION = 180 -- 洋流周期(秒,3分钟) CURRENT_DRIFT_MIN = 15 -- 周期结束偏转最小角度(度) CURRENT_DRIFT_MAX = 45 -- 周期结束偏转最大角度(度) CURRENT_SMOOTH_SPEED = 1.0 -- 方向平滑过渡速度 -- 波动(密集/稀疏) FLOAT_WAVE_CYCLE = 180 -- 波动周期(秒,与洋流同步) FLOAT_DENSE_RATIO = 0.4 -- 密集期占比(前40%密集,后60%稀疏) FLOAT_DENSE_INTERVAL_MULT = 0.5 -- 密集期间隔倍率(更快生成) FLOAT_SPARSE_INTERVAL_MULT = 1.5 -- 稀疏期间隔倍率(更慢生成) -- 交互 INTERACT_DISTANCE = 2.0 -- 交互距离(米) INTERACT_KEY = KEY_E -- PC 交互键 -- 库存 INVENTORY_STACK_MAX_RESOURCE = 50 -- 资源类最大堆叠 INVENTORY_STACK_MAX_FOOD = 20 -- 食物/饮品最大堆叠 INVENTORY_STACK_MAX_TOOL = 1 -- 工具类不堆叠
horizontal linehorizontal line

具体需求

1. 通用交互系统(InteractionManager.lua)

职责:统一管理所有"靠近按E"的交互逻辑,后续篝火/蒸馏器/死亡箱子都复用此系统。
核心逻辑:
  • 维护一个可交互物体注册表
  • 每帧检测玩家与所有已注册物体的距离
  • 距离 ≤ 2.0m 时标记为"可交互",取距离最近的一个作为当前焦点
  • 焦点物体变化时通知 UI(显示/隐藏提示)
  • 收到交互输入(E键/手机按钮)时调用焦点物体的回调
对外接口:
lua
InteractionManager.Init() InteractionManager.Update(dt) -- 注册可交互物体 InteractionManager.Register({ node = node, -- 场景节点(用于距离计算) label = "拾取 木头", -- 交互提示文本 callback = function() -- 交互回调 -- 拾取逻辑 end, once = true, -- true=交互后自动注销(一次性),false=持续可交互 }) -- 注销 InteractionManager.Unregister(node) -- 获取当前焦点(nil=无可交互物体在范围内) InteractionManager.GetCurrentTarget()
优先级规则:多个物体同时在范围内时,选距离最近的。
与现有代码集成
  • Death.lua 中的死亡箱子拾取改为通过 InteractionManager 注册(替代现有硬编码的距离检测)
horizontal linehorizontal line

2. 交互UI(InteractionUI.lua)

使用 urhox-libs/UI 组件:
PC端
  • 屏幕中下方显示提示文本:"按 E [动作描述]"(如"按 E 拾取木头")
  • 半透明黑底圆角标签,白色文字,字号 24px
  • 有焦点时淡入,无焦点时淡出
手机端
  • 进入交互范围时,屏幕右侧(跳跃按钮上方)弹出交互按钮
  • 按钮圆形,直径 80px,显示"E"字样或手掌图标
  • 按钮下方显示动作描述文本
  • 触摸区域至少 88×88px
  • 离开范围或交互完成后按钮消失
horizontal linehorizontal line

3. 漂浮资源系统(Floating.lua)

3.1 资源类型定义

ID名称显示名模型形状(临时几何体)颜色尺寸(m)权重
wood木头木头长条 Box棕色(0.55,0.35,0.15)1.2×0.2×0.235%
leaf树叶树叶扁平 Box绿色(0.2,0.6,0.15)0.6×0.05×0.425%
plastic塑料废旧塑料小 Box灰白(0.8,0.8,0.75)0.3×0.3×0.320%
metal金属废旧金属小 Box深灰(0.35,0.35,0.4)0.25×0.25×0.2515%
crate箱子漂流箱较大 Box金边木色(0.7,0.5,0.2)0.6×0.6×0.65%
TODO: 以上为临时几何体占位,后续需替换为专用3D模型。

3.2 箱子(稀有)特殊表现

  • 模型比普通资源大
  • 添加微微发光效果:节点附带一个 Point Light(金色,Range=1.5m,Brightness=0.5)
  • 拾取时随机获得 2-4 种资源,每种 1-3 个

3.3 生成逻辑

每帧:
  spawnTimer += dt
  if spawnTimer >= currentInterval then
      spawnTimer = 0
      currentInterval = 计算下一次间隔(考虑密集/稀疏期)
      
      groupSize = random(1, 3)
      for i = 1, groupSize do
          if 当前漂浮物数量 < 15 then
              生成一个漂浮物
          end
      end
  end
生成位置:
  • 在洋流来向方向的 80-120m 处随机取点
  • Y 坐标 = SEA_LEVEL(海面)
  • 位置沿洋流垂直方向随机偏移 ±30m(形成宽度)

3.4 洋流系统

初始方向:随机角度
每帧:
  cycleTimer += dt
  if cycleTimer >= CURRENT_CYCLE_DURATION then
      cycleTimer = 0
      targetAngle = currentAngle + random(-DRIFT_MAX, -DRIFT_MIN 或 +DRIFT_MIN, +DRIFT_MAX)
  end
  currentAngle = SmoothLerp(currentAngle, targetAngle, CURRENT_SMOOTH_SPEED * dt)
  currentDirection = Vector3(cos(rad(currentAngle)), 0, sin(rad(currentAngle)))
  • 方向变化是平滑的(不会突变)
  • 提供查询接口供其他系统使用:Floating.GetCurrentDirection()

3.5 漂浮物行为(每帧更新)

对每个活跃漂浮物:
  -- 水平漂流
  pos.x += currentDirection.x * driftSpeed * dt
  pos.z += currentDirection.z * driftSpeed * dt
  
  -- 上下浮动(sin波)
  bobTimer += dt
  pos.y = SEA_LEVEL + sin(bobTimer / bobPeriod * 2π) * BOB_AMPLITUDE
  
  -- 轻微随机旋转(视觉效果)
  rotation.y += rotateSpeed * dt
  
  -- 超出范围销毁
  if distance(pos, ISLAND_POS) > DESPAWN_RADIUS then
      销毁该漂浮物
  end

3.6 拾取逻辑

  • 漂浮物创建时注册到 InteractionManager
  • 交互提示:"拾取 [资源显示名]"
  • 拾取回调:
  • 普通资源:Inventory.Add(resourceId, 1)
  • 箱子:随机选 2-4 种资源,每种 1-3 个,逐个 Add
  • 销毁漂浮物节点
  • 从 InteractionManager 注销
  • 游泳状态下也允许拾取
horizontal linehorizontal line

4. 简易库存(Inventory.lua)

定位:P1 阶段的临时方案,纯数据层。P2 将替换为完整网格背包,但接口尽量兼容。
数据结构:
lua
-- 内部存储 items_ = { wood = { count = 5, maxStack = 50, displayName = "木头", category = "resource" }, leaf = { count = 3, maxStack = 50, displayName = "树叶", category = "resource" }, ... }
对外接口:
lua
Inventory.Init() -- 初始化 Inventory.Add(itemId, amount) -- 添加物品,返回实际添加数量(可能因上限截断) Inventory.Remove(itemId, amount) -- 移除物品,返回实际移除数量 Inventory.GetCount(itemId) -- 获取数量 Inventory.Has(itemId, amount) -- 是否持有至少 N 个 Inventory.GetAll() -- 获取所有物品 {id, count, displayName, category} Inventory.Clear() -- 清空(死亡时调用) Inventory.IsEmpty() -- 是否空背包
物品注册表(在 Inventory 内部或单独 ItemDefs):
lua
ITEM_DEFS = { wood = { displayName = "木头", maxStack = 50, category = "resource" }, leaf = { displayName = "树叶", maxStack = 50, category = "resource" }, plastic = { displayName = "废旧塑料", maxStack = 50, category = "resource" }, metal = { displayName = "废旧金属", maxStack = 50, category = "resource" }, rope = { displayName = "绳索", maxStack = 50, category = "resource" }, fish_raw = { displayName = "生鱼", maxStack = 20, category = "food" }, fish_cooked = { displayName = "烤鱼", maxStack = 20, category = "food" }, water = { displayName = "淡水", maxStack = 20, category = "food" }, rod = { displayName = "简易鱼竿", maxStack = 1, category = "tool" }, }
与死亡系统集成
  • 死亡时:如果 Death.GetKeepItems() == false,调用 Inventory.Clear()
  • 死亡箱子物品取回:P2 再实现(当前箱子仍为空壳)
horizontal linehorizontal line

5. 资源面板UI(ResourcePanel.lua)

使用 urhox-libs/UI 组件:
位置:屏幕右上角,齿轮按钮下方
样式:
  • 半透明黑底(rgba 0,0,0,0.5),圆角 8px,padding 8px
  • 紧凑的垂直列表,每行显示:"[资源名] ×[数量]"
  • 字号 20px,白色文字
  • 只显示数量 > 0 的资源
  • 背包为空时不显示面板(隐藏)
  • 最多同时显示 8 行(超出时显示 "..." 提示)
更新机制:
  • 物品变化时刷新(不需要每帧更新)
  • Inventory 变化时通过回调通知 ResourcePanel 刷新
:此面板为 P1 临时方案,P2 做完整背包后将移除。
horizontal linehorizontal line

6. 波动机制(密集/稀疏期)

与洋流共享 3 分钟周期:
  • 前 40%(0~72秒):密集期,生成间隔 × 0.5(更频繁)
  • 后 60%(72~180秒):稀疏期,生成间隔 × 1.5(更缓慢)
这模拟了"一波资源涌来,然后平静"的节奏。
horizontal linehorizontal line

集成要求

在 main.lua 中:
  • require 并初始化 InteractionManager、Floating、Inventory 模块
  • 在 HandleUpdate 中调用它们的 Update(dt)
  • InteractionManager 需要知道玩家节点位置(传入 Controller.GetNode())
与 Death.lua 集成:
  • 死亡时调用 Inventory.Clear()(根据设置判断)
  • 死亡箱子改为通过 InteractionManager 注册(替代原有硬编码的距离检测)
与 HUD.lua 集成:
  • 新增交互按钮(手机端)
  • 新增资源面板显示区域
调试控制台扩展(可选):
  • give <itemId> [amount] — 给予物品
  • clearinv — 清空库存
  • spawn <resourceType> — 在玩家前方生成漂浮物
horizontal linehorizontal line

验收标准

  • [ ] 游戏运行 10-20 秒后,远处开始有漂浮物出现
  • [ ] 漂浮物沿水面缓慢移动(有明确方向性)
  • [ ] 漂浮物有明显的上下浮动效果(海面起伏感)
  • [ ] 有 5 种不同资源(颜色/形状/大小可区分):棕色长条(木头)、绿色扁片(树叶)、灰白方块(塑料)、深灰方块(金属)、金色大箱子
  • [ ] 金色箱子有微微发光效果(Point Light)
  • [ ] 角色靠近漂浮物 2m 以内时,屏幕中下方显示"按 E 拾取 [资源名]"
  • [ ] 手机端:进入范围时右侧弹出交互按钮
  • [ ] 按 E / 点击交互按钮后漂浮物消失,右上角资源面板数量 +1
  • [ ] 拾取金色箱子时获得多种资源(2-4种,每种1-3个)
  • [ ] 游泳状态下也能拾取
  • [ ] 漂浮物漂出 150m 后自动消失
  • [ ] 同时存在的漂浮物不超过 15 个
  • [ ] 有明显的密集期/稀疏期节奏变化
  • [ ] 洋流方向每 3 分钟平滑偏转(观察漂浮物方向有变化)
  • [ ] 资源面板只在有物品时显示,为空时隐藏
  • [ ] 资源达到堆叠上限(50)后继续拾取同类无效果
  • [ ] 死亡后库存被清空(保留物品设置关闭时)
  • [ ] 死亡箱子改用通用交互系统(靠近有提示,按E销毁)
  • [ ] 构建通过,无报错
horizontal linehorizontal line

标注:后续需完善项

以下用临时方案占位,后续阶段需要替换:
项目当前方案后续目标
漂浮物模型几何体 Box(不同颜色/尺寸)专用 3D 模型(木板、瓶子、铁片等)
库存系统简易计数器 + 列表面板P2 完整网格背包 + 快捷栏 + 拖拽
死亡箱子取回空壳销毁P2 实际取回物品
资源面板右上角临时列表P2 做完背包后移除
请基于现有项目结构开发,使用 urhox-libs/UI 组件库做所有 UI,完成后 build。
2