几个小时前刚接触lua的人,我在C ++和Java方面有一定的背景知识,但没什么令人惊奇的。
我正在尝试开发一款游戏插件,以检查周围的玩家,如果可以(在10码内)向他们致意。
效果很好,只不过我只希望每位玩家运行一次,因为它会变得垃圾且令人讨厌,经常与人们打招呼。
我认为最好的方法是将它们的字符名称存储在数组中,但是我正在努力理解数组的语法。
function Wave()
local totalObjects = GetObjectCount()
local shouldMessage = false
local player = GetActivePlayer()
arrayNames = {}
for i = 1, totalObjects do
local object = GetObjectWithIndex(i)
if object ~= player and UnitIsPlayer(object) == true and UnitIsDead(object) == false then
local yards = GetDistanceBetweenObjects(player, object)
local name = ObjectName(object)
----------------- The beginning of my issue ----------------
if yards < 10 and arrayNames[i] ~= name then -- if name isnt in array already?
arrayNames[i] = name -- trying to add the name to array
print(arrayNames[i])
break
end
end
end
if storeName then
end
end
问题是,每次调用Wave后,您的表都会被清除。这是因为您正在函数内部执行arrayNames = {}
,因此每次运行该表时都会将其设置为一个新的空表。您可以在arrayNames
函数之外定义Wave
或将其更改为arrayNames = arrayNames or {}
第二个选项将在定义arrayNames
时将其等于arrayNames
,如果未定义,则将其设置为新表。
另外
您的代码仅检查name
是否在特定索引的数组中,而不是检查整个数组。如果玩家的索引可以更改,那么您可能会使用此方法再次打招呼。
您也需要遍历整个数组,以确保您尚未与这个人打招呼。这意味着,随着您与越来越多的人打招呼,支票将越来越长
建议不要使用数组:
if yards < 10 and not arrayNames[name] then -- if name isnt in set already?
arrayNames[name] = true -- trying to add the name to set
print(name)
break
end
仅使用name
作为键添加到表中,并将值设置为true
,这将为检查提供O(1)性能。
以下是有关布景的更多信息:https://en.wikipedia.org/wiki/Set_(abstract_data_type)
在计算机科学中,集合是一种抽象数据类型,可以存储唯一值而没有任何特定顺序。它是有限集的数学概念的计算机实现。与大多数其他集合类型不同,通常不从集合中检索特定元素,而是测试集合中成员资格的值。