查看: 27|回复: 1

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

[复制链接]

35

主题

96

回帖

1356

积分

金牌会员

积分
1356
QQ
发表于 2026-5-29 18:58:37 | 显示全部楼层 |阅读模式

-- 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
        selfnItemsRecycled(recycledItems)
    end
end

-- 事件回调占位,实际项目中应接入事件总线
function AutoRecyclernItemsRecycled(items)
    print("[AutoRecycler] 回收完成:")
    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 实现一个完整的背包数据结构,或如何搭建轻量级事件总线),请随时告诉我

0

主题

158

回帖

1082

积分

金牌会员

积分
1082
发表于 2026-5-29 22:01:44 | 显示全部楼层
还不错,有点东西!支持你可惜看着像ai写的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表