前言
众所周知哈,这个迷你的触发器在面对频繁的触发时性能欠佳,尤其是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防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网](https://www.mnhui.top/huiyue/33fc3104-7332-46f0-b888-ebdfd551ad9c.png)
变量创建好后,我们就可以开始设置脚本参数啦!由于2.0开发模式没有提供脚本与触发器交互功能,所以这里只能进入到脚本视图修改脚本,不过灰当然也考虑到了这个问题,将你要修改的地方标识的很清楚,就是上面那个“元数据”区,你只需要修改那个地方就可以啦!
![图片[2]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网](https://www.mnhui.top/huiyue/e07f3485-173b-4c17-96ba-c6084ed22a94.png)
Time:防连点间隔阈值。
vValue:你刚才创建的布尔值变量名称。
改好这两个参数后,脚本就能正常跑起来啦!那我们在触发器里自定义的逻辑怎么判断是否连点呢?只需要在触发器下面加一个条件即可。
![图片[3]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网](https://www.mnhui.top/huiyue/834e1eb5-1d68-41d8-99be-6d988bf2ecfb.png)
当这个布尔值为“假”时,则说明当前不处于连点状态;当布尔值为“真”时,则说明“点击过于频繁啦~”。
这个条件也是可选的,如果你的按钮不需要防连点,这个条件可以不加哦。
使用教程(3.0)
同上,将脚本代码复制到UI界面的脚本视图保存并退出,这边不过多赘述。
同上,你需要一个玩家布尔值私有变量,通过这个变量判断当前是不是处于连点状态,默认值为“假”,无需上传云变量。
变量设置好后,我们来设置脚本参数,一定要在UI界面的这个位置才可以看到并修改,如下图所示。
![图片[4]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网](https://www.mnhui.top/huiyue/0ec8ffc9-d695-4024-b2f9-81b91cc0b508.png)
防连点间隔就是上面的Time,如果玩家在0.10秒内点击了2次则说明“点击过于频繁啦~”,至于布尔ID,你需要通过下面的方式来获取,并填入。
![图片[5]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网](https://www.mnhui.top/huiyue/b4b23091-a5de-4fc0-872c-64458e0ccc2b.png)
随后,这个脚本就可以正常运行啦,那怎么判断连点呢?如下图所示。
![图片[6]-UI防连点器脚本(针对触发器开发者)-玩法论坛-论坛-辉月官网](https://www.mnhui.top/huiyue/d74c8dc6-b8be-4511-981f-b1e098217100.png)
聪明的小伙伴可以发现,跟2.0开发模式一模一样,哈哈,没错,就是一样的。
当这个布尔值为“假”时,则说明当前不处于连点状态;当布尔值为“真”时,则说明“点击过于频繁啦~”。
结尾
以上就是这个贴子的教学啦,制作不易,大家多多点赞哦。




没有回复内容