lulu888 发表于 2026-5-29 18:58:37

分享一个通用的、引擎无关的 Lua 背包自动回收系统框架


-- AutoRecycler.lua
-- 一个数据驱动的通用物品自动回收模块,不依赖任何特定游戏引擎

local AutoRecycler = {}
AutoRecycler.__index = AutoRecycler

-- 创建回收器实例,传入玩家背包引用和回收规则配置
function AutoRecycler.new(inventory, rules)
    local self = setmetatable({}, AutoRecycler)
    self.inventory = inventory      -- 背包数据接口(需实现 getItems, removeItem 等方法)
    self.rules = rules or {}      -- 回收规则表,由配置文件加载
    self.enabled = false
    return self
end

-- 从配置表加载回收规则(数据驱动核心)
-- 规则格式: { itemId = 1001, keepCount = 5, priority = 1 }
function AutoRecycler:loadRules(ruleTable)
    self.rules = {}
    for _, rule in ipairs(ruleTable) do
      -- 按优先级排序,高优先级先处理
      table.insert(self.rules, rule)
    end
    table.sort(self.rules, function(a, b)
      return (a.priority or 0) > (b.priority or 0)
    end)
end

-- 执行一次自动回收扫描
function AutoRecycler:tick()
    if not self.enabled then return end
   
    local recycledItems = {}
   
    for _, rule in ipairs(self.rules) do
      local items = self.inventory:getItemsById(rule.itemId)
      local totalCount = 0
      for _, item in ipairs(items) do
            totalCount = totalCount + (item.count or 1)
      end
      
      -- 计算需要回收的数量
      local recycleCount = totalCount - (rule.keepCount or 0)
      if recycleCount > 0 then
            -- 调用背包接口移除物品,返回实际移除数量
            local actualRemoved = self.inventory:removeItem(rule.itemId, recycleCount)
            if actualRemoved > 0 then
                table.insert(recycledItems, {
                  itemId = rule.itemId,
                  count = actualRemoved
                })
            end
      end
    end
   
    -- 触发回收事件,供UI更新或日志记录(发布-订阅模式)
    if #recycledItems > 0 then
      self:onItemsRecycled(recycledItems)
    end
end

-- 事件回调占位,实际项目中应接入事件总线
function AutoRecycler:onItemsRecycled(items)
    print(" 回收完成:")
    for _, item in ipairs(items) do
      print(string.format("物品ID:%d 数量:%d", item.itemId, item.count))
    end
end

-- 开关控制
function AutoRecycler:setEnabled(state)
    self.enabled = state
end

return AutoRecycler




这个框架所展示的架构思维和编码规范,可以直接迁移到任何正规游戏项目的开发中。如果你希望深入了解其中某个环节(例如如何用 Lua 实现一个完整的背包数据结构,或如何搭建轻量级事件总线),请随时告诉我

qq154886255 发表于 2026-5-29 22:01:44

还不错,有点东西!支持你可惜看着像ai写的
页: [1]
查看完整版本: 分享一个通用的、引擎无关的 Lua 背包自动回收系统框架