UI防连点器脚本(针对触发器开发者)

前言

众所周知哈,这个迷你的触发器在面对频繁的触发时性能欠佳,尤其是UI方面,如果有哪个玩家“咔嚓”一下!把连点器干开了,有些Bug甚至可以让这种玩家无限刷资源。那么这个时候,有的小伙伴就说了,“诶?那我们做个防连点器的触发器不就行了”,这个想法呢很不错,现实却很残酷,触发器做防连点器也会遇到性能问题,当然有的小伙伴做的很不错,可能有办法解决这个问题。那今天,灰给大家提供一个脚本,可以让触发器0成本实现高性能防连点。

代码分享

以下是2.0开发模式脚本

-----------------元数据-----------------
local Time = 0.1       -- 前一次点击与后一次点击间隔时间
local vValue = "防连点"  -- 判断是否连点的玩家布尔值变量名称
--------------------元数据--------------

--------------------预定义区(不用管)--------------
-- k:玩家迷你号
-- v:计时器ID
local TimerData = {}
--------------------预定义区(不用管)--------------

--------------------功能区-----------------
local function On_timer_change(e)
    local tid = tonumber(e.timerid)
    local time = tonumber(e.timertime)
    local tin = tonumber(e.timername)
    if time <= 0 and tin and TimerData[tin] == tid then
        VarLib2:setPlayerVarByName(tin,5,vValue,false)
        MiniTimer:deleteTimer(tid)
        TimerData[tin] = nil
    end
end

local function On_click_ui(e)
    -- 这边这个tonumber很多懂脚本的都反驳我,迷你的e.eventobjid肯定是number类型啊。
    -- 这么做不是多此一举吗?这个地方主要是一个后端开发的习惯问题,懂得都懂,如果看不习惯可以自行删除或修改。
    local uin = tonumber(e.eventobjid)
    if TimerData[uin] then return end
    VarLib2:setPlayerVarByName(uin,5,vValue,true)
    local result,id=MiniTimer:createTimer(tostring(uin),nil,true)
    if result then
        MiniTimer:startBackwardTimer(id,Time,false)
        if not TimerData[uin] and uin then
            TimerData[uin] = id
        end
    end
end

-- 这个很关键,一旦玩家离开,必须把计时器删掉,否则会导致内存泄漏
local function On_player_leave(e)
    local uin = tonumber(e.eventobjid)
    if uin and TimerData[uin] then
        MiniTimer:deleteTimer(TimerData[uin])
        TimerData[uin] = nil
        VarLib2:setPlayerVarByName(uin,5,vValue,false)
    end
end

ScriptSupportEvent:registerEvent([=[UI.Button.Click]=], On_click_ui)
ScriptSupportEvent:registerEvent([=[minitimer.change]=], On_timer_change)
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.LeaveGame]=], On_player_leave)
--------------------功能区-----------------
以下是3.0开发模式脚本
local Script = {}

local TimerData = {}

--属性定义
Script.propertys = {
    Time = {
        type = Mini.Number,
        default = 0.1,--默认值
        displayName = "防连点间隔阈值(最多2位小数)",
        minValue = 0, -- 最小值
	    maxValue = 10,-- 最大值
        format = "%.2f",
        style = ComponentUIStyle.NumberOnlyInput,
        tips = "单位:秒,设置前后两次点击间隔时间,低于该时间视为连点",
    },
    vValue = {
        type = Mini.String,-- 类型
        default = "v758635103015793234736723",-- 默认值
        displayName = "防连点布尔ID",-- 属性别名
        multiLine = false, -- 是否多行
        maxLength = 100, -- 最多100个字符
        tips = "判断是否连点的玩家布尔值变量ID",-- 提示
    }
}

function Script:On_timer_change(e)
    local tid = tonumber(e.timerid)
    local time = tonumber(e.timertime)
    local tin = tonumber(e.timername)
    if time <= 0 and tin and TimerData[tin] == tid then
        Data:SetValue(self.vValue, tin, false)
        Timer:DeleteTimer(tid)
        TimerData[tin] = nil
    end
end

function Script:On_click_ui(e)
    -- 这边这个tonumber很多懂脚本的都反驳我,迷你的e.eventobjid肯定是number类型啊。
    -- 这么做不是多此一举吗?这个地方主要是一个后端开发的习惯问题,懂得都懂,如果看不习惯可以自行删除或修改。
    local uin = tonumber(e.eventobjid)
    if TimerData[uin] then return end
    Data:SetValue(self.vValue, uin, true)
    local Id = Timer:CreateTimer(tostring(uin))
    if Id then
        Timer:StartBackwardTimer(Id, self.Time, false)
        if not TimerData[uin] and uin then
            TimerData[uin] = Id
        end
    end
end

-- 这个很关键,一旦玩家离开,必须把计时器删掉,否则会导致内存泄漏
function Script:On_player_leave(e)
    local uin = tonumber(e.eventobjid)
    if uin and TimerData[uin] then
        Timer:DeleteTimer(TimerData[uin])
        TimerData[uin] = nil
        Data:SetValue(self.vValue, uin, false)
    end
end

-- 组件启动时调用
function Script:OnStart()
    self:AddTriggerEvent(TriggerEvent.UIButtonClick, self.On_click_ui)
    self:AddTriggerEvent(TriggerEvent.GameAnyPlayerLeaveGame, self.On_player_leave)
    self:AddTriggerEvent(TriggerEvent.MinitimerChange, self.On_timer_change)
end

return Script

使用教程(2.0)

首先,将脚本代码复制到UI界面的脚本视图保存并退出,这边不过多赘述。
随后,你需要一个玩家布尔值私有变量,通过这个变量判断当前是不是处于连点状态,默认值为“假”,无需上传云变量。

图片[1]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网

变量创建好后,我们就可以开始设置脚本参数啦!由于2.0开发模式没有提供脚本与触发器交互功能,所以这里只能进入到脚本视图修改脚本,不过灰当然也考虑到了这个问题,将你要修改的地方标识的很清楚,就是上面那个“元数据”区,你只需要修改那个地方就可以啦!

图片[2]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网

Time:防连点间隔阈值。
vValue:你刚才创建的布尔值变量名称。
改好这两个参数后,脚本就能正常跑起来啦!那我们在触发器里自定义的逻辑怎么判断是否连点呢?只需要在触发器下面加一个条件即可。

图片[3]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网

当这个布尔值为“假”时,则说明当前不处于连点状态;当布尔值为“真”时,则说明“点击过于频繁啦~”。
这个条件也是可选的,如果你的按钮不需要防连点,这个条件可以不加哦。
使用教程(3.0)
同上,将脚本代码复制到UI界面的脚本视图保存并退出,这边不过多赘述。
同上,你需要一个玩家布尔值私有变量,通过这个变量判断当前是不是处于连点状态,默认值为“假”,无需上传云变量。
变量设置好后,我们来设置脚本参数,一定要在UI界面的这个位置才可以看到并修改,如下图所示。

图片[4]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网

防连点间隔就是上面的Time,如果玩家在0.10秒内点击了2次则说明“点击过于频繁啦~”,至于布尔ID,你需要通过下面的方式来获取,并填入。

图片[5]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网

随后,这个脚本就可以正常运行啦,那怎么判断连点呢?如下图所示。

图片[6]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网

聪明的小伙伴可以发现,跟2.0开发模式一模一样,哈哈,没错,就是一样的。
当这个布尔值为“假”时,则说明当前不处于连点状态;当布尔值为“真”时,则说明“点击过于频繁啦~”。
结尾

以上就是这个贴子的教学啦,制作不易,大家多多点赞哦。

请登录后发表评论

    没有回复内容