向数组中添加名称,检查数组中是否存在名称,运行代码 新的Lua,几个小时前,我有一些中等背景的C++和java,但没什么了不起的。

向数组中添加名称,检查数组中是否存在名称,运行代码 新的Lua,几个小时前,我有一些中等背景的C++和java,但没什么了不起的。,lua,Lua,我正在尝试为一款游戏开发一个插件,用于检查我周围的玩家,如果是的话(在10码以内)会向他们致意 它工作的很好,除了我只希望它运行一次,每个球员,因为它将是垃圾邮件和恼人的不断问候的人 我认为最好的方法是将它们的字符名存储在数组中,但我很难理解数组的语法 function Wave() local totalObjects = GetObjectCount() local shouldMessage = false local player

我正在尝试为一款游戏开发一个插件,用于检查我周围的玩家,如果是的话(在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
函数波()
本地totalObjects=GetObjectCount()
本地shouldMessage=false
本地播放器=GetActivePlayer()
arrayNames={}
对于i=1,totalObjects会
本地对象=GetObjectWithIndex(i)
如果object~=player和UnitIsPlayer(object)=true,UnitIsDead(object)=false,则
本地码=获取对象(玩家、对象)之间的距离
本地名称=对象名称(对象)
-----------------我的问题的开始----------------
如果码数<10且arrayNames[i]~=name,那么——如果name不在数组中?
arrayNames[i]=名称--尝试将名称添加到数组中
打印(arrayNames[i])
打破
结束
结束
结束
如果是storeName,那么
结束
结束

问题在于,每次调用Wave后,您的表都会被清除。这是因为您正在函数中执行
arrayNames={}
,因此每次运行该函数时,表都被设置为一个新的空表。您可以在
Wave
函数之外定义
arrayNames
或将其更改为
arrayNames=arrayNames或{}
第二个选项将在定义时将
arrayNames
设置为等于
arrayNames
,如果未定义,则将其设置为新表


另外

代码只检查数组中特定索引处是否存在
名称
,而不检查整个数组。如果玩家的索引可以改变,那么你很可能会用这种方法再次问候他们

你还需要检查整个阵列,确保你还没有向此人打招呼。这意味着当你问候越来越多的人时,支票会越来越长

我建议使用集合,而不是使用数组:

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
如果码数<10,而不是arrayNames[name],那么——如果name不在集合中?
arrayNames[name]=true--尝试将名称添加到集合
印刷品(名称)
打破
结束
只需将
名称
作为键添加到表中,并将值设置为
true
,这将为您的检查提供O(1)性能

以下是有关集合的更多信息:

在计算机科学中,集合是一种抽象的数据类型,可以存储唯一的值,而不需要任何特定的顺序。它是有限集数学概念的计算机实现。与大多数其他集合类型不同,通常测试集合中的成员资格值,而不是从集合中检索特定元素


谢谢你的回复!这是有道理的,但仍然在重复运行,我应该提到,这个函数在游戏中的每一帧更新都会被重新调用,这是否意味着它每次都会重置局部变量?(因此不能正常工作)啊,那么问题是你的桌子在每一帧之后都会被清空。它需要在每帧运行的循环之外定义。。。更清楚地说,因为您在函数内部执行
arrayNames={}
,所以每次都会重置表。您可以将其更改为
arrayNames=arrayNames或{}
Ah,这就是问题所在!!我甚至没有注意到这一点,但现在它变得非常合理。非常感谢你!它工作得很好。