我是lua后端老师!
小仙,我来帮你优化这个函数,让它更简洁高效地使用`getobjectinmap`的参数。根据你的需求,我重新设计了函数逻辑:
```lua
function godTier_skill_trigger:GetTargetsInRange(actor, centerX, centerY, radius, targetType)
release_print("GetTargetsInRange", centerX, centerY, radius, targetType)
local targets = {}
local map_id = getbaseinfo(actor, 3)
-- 处理不填参数或参数为nil的情况
if targetType == nil then
-- 获取所有类型的对象(玩家+怪物+英雄+分身+宝宝)
local allObjects = getobjectinmap(map_id, centerX, centerY, radius, 1 + 2 + 64 + 128 + 256)
if allObjects then
for _, obj in ipairs(allObjects) do
if obj then
table.insert(targets, obj)
end
end
end
return targets
end
-- 如果targetType是空表{},也获取所有类型
if type(targetType) == "table" and #targetType == 0 then
local allObjects = getobjectinmap(map_id, centerX, centerY, radius, 1 + 2 + 64 + 128 + 256)
if allObjects then
for _, obj in ipairs(allObjects) do
if obj then
table.insert(targets, obj)
end
end
end
return targets
end
-- 如果targetType是表且有内容,计算flag值
if type(targetType) == "table" then
local flag = 0
for _, ttype in ipairs(targetType) do
if ttype == 1 then
flag = flag + 1 -- 玩家
elseif ttype == 2 then
flag = flag + 2 -- 怪物
elseif ttype == 32 then
flag = flag + 32 -- 人形怪
elseif ttype == 64 then
flag = flag + 64 -- 英雄
elseif ttype == 128 then
flag = flag + 128 -- 分身
elseif ttype == 256 then
flag = flag + 256 -- 宝宝、随从
end
end
-- 如果flag为0,说明传入了无效参数,返回空表
if flag == 0 then
return {}
end
local objects = getobjectinmap(map_id, centerX, centerY, radius, flag)
if objects then
for _, obj in ipairs(objects) do
if obj then
table.insert(targets, obj)
end
end
end
return targets
end
-- 如果targetType是单个数字参数
if type(targetType) == "number" then
local objects = getobjectinmap(map_id, centerX, centerY, radius, targetType)
if objects then
for _, obj in ipairs(objects) do
if obj then
table.insert(targets, obj)
end
end
end
return targets
end
-- 其他情况返回空表
return {}
end
```
**使用示例:**
```lua
-- 1. 不填参数或nil:获取所有类型
local allTargets = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, nil)
local allTargets2 = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5)
-- 2. 空表{}:获取所有类型
local allTargets3 = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {})
-- 3. 单个数字参数:获取指定类型
local playersOnly = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, 1) -- 只获取玩家
local monstersOnly = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, 2) -- 只获取怪物
local heroesOnly = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, 64) -- 只获取英雄
-- 4. 表参数:获取多种类型组合
local playersAndMonsters = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {1, 2}) -- 玩家和怪物
local heroesAndCopies = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {64, 128}) -- 英雄和分身
local allHumanoids = godTier_skill_trigger:GetTargetsInRange(actor, 100, 100, 5, {1, 64, 128}) -- 玩家、英雄、分身
```
**优化说明:**
1. **直接使用`getobjectinmap`的flag参数**:通过位运算组合需要的对象类型
2. **简化逻辑**:去掉了不必要的距离计算,因为`getobjectinmap`已经按范围筛选
3. **支持多种调用方式**:
- `nil`或不填:获取所有类型
- `{}`空表:获取所有类型
- 单个数字:获取指定类型
- 表:获取多种类型组合
4. **更高效**:一次调用获取所有符合条件的对象,不需要多次遍历
这样修改后,函数更加简洁高效,完全符合你的需求!如果还有不明白的地方,随时问我哦~