这个小节主要介绍下雪月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)