这个小节主要介绍下雪月Lua框架 xLua\module\Unit文件夹内与单位有关的方法。

xLua\module\Unit 文件夹内包含多个与单位(unit)相关的模块和方法。

1. 基础单位类 (cUnit)

  • 文件路径: xLua\module\Unit\init.lua
  • 描述: 定义了单位的基本属性和方法。

方法列表:

  • unit:new(params):

    • 描述: 创建一个新的单位对象。
    • 参数:

      • params (table): 包含创建单位所需参数的表,如 player, id, x, y, face

        • player (player): 所属玩家对象。
        • id (string): 单位ID,支持格式如 @农民, *农, hpea
        • x (number, 可选): 单位创建位置的X坐标,默认为0。
        • y (number, 可选): 单位创建位置的Y坐标,默认为0。
        • face (number, 可选): 单位朝向角度,默认为270度。
    • 返回值: 返回一个单位对象。
    • 示例:

      local hero = unit:new({
          player = player1,
          id = "*玛维",
          x = 500,
          y = 500,
          face = 90
      })
  • cUnit:init():

    • 描述: 初始化单位对象,通常在创建单位对象时自动调用。
    • 内部使用,无需手动调用。

2. 单位事件 (event)

  • 文件路径: xLua\module\Unit\event\init.lua
  • 描述: 提供了注册和处理单位事件的功能。

方法列表:

  • unit:event(event_name, func):

    • 描述: 注册特定单位的事件。
    • 参数:

      • event_name (string): 事件名称,如 "单位-受伤"、"单位-死亡"、"单位-丢弃物品" 等。
      • func (function): 回调函数,接收两个参数:eventparams
    • 返回值: 返回事件对象或 nil(如果事件不存在)。
    • 示例:

      hero:event("单位-受伤", function(event, params)
          print("英雄受到了伤害")
      end)
  • unit:event_gc(event_name):

    • 描述: 重新注册特定的单位事件(垃圾回收),仅支持原生事件。
    • 参数:

      • event_name (string): 事件名称。
    • 示例:

      hero:event_gc("单位-受伤")

3. 具体单位事件

  • 文件路径: xLua\module\Unit\event\*.lua
  • 描述: 提供了各种具体的单位事件处理逻辑。

具体事件模块:

  • death.lua:

    • 描述: 处理单位死亡事件。
    • 方法:

      • unit:event("单位-死亡", func): 注册单位死亡事件。
    • 示例:

      hero:event("单位-死亡", function(event, params)
          print("英雄已死亡")
      end)
  • damaged.lua:

    • 描述: 处理单位受伤事件。
    • 方法:

      • unit:event("单位-受伤", func): 注册单位受伤事件。
    • 示例:

      hero:event("单位-受伤", function(event, params)
          print("英雄受到了伤害")
      end)
  • useItem.lua:

    • 描述: 处理单位使用物品事件。
    • 方法:

      • unit:event("单位-使用物品", func): 注册单位使用物品事件。
    • 示例:

      hero:event("单位-使用物品", function(event, params)
          print("英雄使用了物品")
      end)
  • pickItem.lua:

    • 描述: 处理单位拾取物品事件。
    • 方法:

      • unit:event("单位-拾取物品", func): 注册单位拾取物品事件。
    • 示例:

      hero:event("单位-拾取物品", function(event, params)
          print("英雄拾取了物品")
      end)
  • dropItem.lua:

    • 描述: 处理单位丢弃物品事件。
    • 方法:

      • unit:event("单位-丢弃物品", func): 注册单位丢弃物品事件。
    • 示例:

      hero:event("单位-丢弃物品", function(event, params)
          print("英雄丢弃了物品")
      end)
  • pawnItem.lua:

    • 描述: 处理单位典当物品事件。
    • 方法:

      • unit:event("单位-典当物品", func): 注册单位典当物品事件。
    • 示例:

      hero:event("单位-典当物品", function(event, params)
          print("英雄典当了物品")
      end)
  • buy&sellItem.luabuy&sellUnit.lua:

    • 描述: 分别处理单位购买和出售物品、单位的事件。
    • 方法:

      • unit:event("单位-购买物品", func): 注册单位购买物品事件。
      • unit:event("单位-出售物品", func): 注册单位出售物品事件。
      • unit:event("单位-购买单位", func): 注册单位购买单位事件。
      • unit:event("单位-出售单位", func): 注册单位出售单位事件。
    • 示例:

      hero:event("单位-购买物品", function(event, params)
          print("英雄购买了物品")
      end)
      
      hero:event("单位-出售物品", function(event, params)
          print("英雄出售了物品")
      end)
      
      hero:event("单位-购买单位", function(event, params)
          print("英雄购买了单位")
      end)
      
      hero:event("单位-出售单位", function(event, params)
          print("英雄出售了单位")
      end)
  • choose.lua:

    • 描述: 处理单位选择事件。
    • 方法:

      • unit:event("单位-选择", func): 注册单位选择事件。
    • 示例:

      hero:event("单位-选择", function(event, params)
          print("英雄被选择了")
      end)

4. 单位扩展 (extends)

  • 文件路径: xLua\module\Unit\extends\*.lua
  • 描述: 提供了对单位的扩展功能。

扩展模块:

  • group.lua:

    • 描述: 提供了管理单位组的功能。
    • 方法:

      • unit.group:new(): 创建一个新的单位组。
      • unit.group:addUnit(unit): 将单位添加到单位组中。
      • unit.group:removeUnit(unit): 从单位组中移除单位。
      • unit.group:forEach(callback): 遍历单位组中的所有单位。
    • 示例:

      local unitGroup = unit.group:new()
      unitGroup:addUnit(hero)
      
      unitGroup:forEach(function(u)
          print("单位组中的单位:", u.id)
      end)
  • item.lua:

    • 描述: 提供了单位与物品交互的功能。
    • 方法:

      • unit:addItem(id): 给单位添加物品。
      • unit:getItems(): 获取单位持有的所有物品。
    • 示例:

      hero:addItem("*药水")
      local items = hero:getItems()
      for _, item in ipairs(items) do
          print("英雄持有物品:", item.id)
      end
  • logic.lua:

    • 描述: 提供了单位行为逻辑的扩展。
    • 方法:

      • unit:setLogic(logic): 设置单位的行为逻辑。
    • 示例:

      hero:setLogic(function()
          print("执行英雄的行为逻辑")
      end)
  • state.lua:

    • 描述: 提供了单位状态管理的功能。
    • 方法:

      • unit:setState(state): 设置单位的状态。
      • unit:getState(): 获取单位的当前状态。
    • 示例:

      hero:setState("战斗中")
      print("英雄当前状态:", hero:getState())

总结

以上是 xLua\module\Unit 文件夹内的主要方法及其使用方式。通过这些方法,你可以方便地管理和操作单位对象,包括创建、设置属性、注册事件等。

实操练习

在上一小节的基础上,我们输入以下代码进行练习吧

-- 给玩家1和玩家2各创建1个英雄单位
local hero1 = unit:new({
    player = p1,
    id = "Hmbr",
    x = 0,
    y = 0,
    face = 270,
})

local hero2 = unit:new({
    player = p2,
    id = "Ogrh",
    x = 100,
    y = 100,
    face = 270,
})

-- 给英雄1和英雄2添加物品
hero1:addItem("arsh")
hero2:addItem("ratf")

hero1:event("单位-丢弃物品", function(event, params)
    p1:msg("英雄1丢弃了物品")
end)

hero1:event("单位-获得物品", function(event, params)
    p1:msg("英雄1获得了物品")
end)

hero2:event("单位-死亡", function(event, params)
    p1:msg("英雄2已死亡")
end)