这个小节主要介绍下雪月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): 回调函数,接收两个参数:event和params。
- 返回值: 返回事件对象或
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.lua和buy&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)