主站
地图测试
道具百科
触发器百科
脚本API百科
创作手册
创作功能
其他
Studio百科
K/V存储和排行榜
迷你世界 更新时间: 2024-06-25 16:44:32
排行榜和K/V数据存储功能将为开发者开发具有网络化、功能更加丰富的地图提供更有力的保障。开发者不仅可以对玩家个人数据,还可以对地图维度的全局数据(如战力排行榜,竞速时间排行榜等)进行管理、保存、使用。

 

K/V存储

为一般普通的数据存储,其如同一张表,而表里面可以存任何类型的数据,并且可以存储多个不同关键字(Key)的表。

 

存储中的每个值(value)都由一个独特的键(key)索引,可以往里面添加任意值。一个key只能对应一个value,value类型可以是数值,可以是字符串,也可以是json字符串等。例如玩家相关数据可如下所示存取:

键 (KEY)

值 (VALUE)

level 50
attr { "flowers": 100, "level": 6, "vip": 3,"played_count": 13, "label": "超神"}
coin 78000

 

通过相同的数据集名称和键(key),就可以针对数据进行存/取操作。

 

排行榜数据

为有序数据集合,其数据存储的类型为数值类型,系统会按照数值自动进行排序,故我们把它简称为排行榜数据,其可以存储多个维度的数据进行自动排序。

  1. 排行榜可以实现地图排名前1000位玩家的数据,实现全图排行榜功能
  2. 排行榜默认排序方式为(升序)从小到大,使用get数据时,正数代表升序,负数代表降序
  3. 排行榜只能存正整数,存入的小数会进行取整数部分

 

排行榜基本格式如下:

键(KEY)(玩家迷你号)

值 (VALUE)

10000 5
1000085 10
10000354 12

 

 

数据保存的有效期

  1. 地图审核通过且状态属于有效中,其所存储的数据即处于有效中。
  2. 地图取消上传,数据将会继续保留30天,如果30天内未重新上传,数据将会彻底清除,无法恢复。
  3. 地图开发者主动调取删除接口,或者地图删除,则数据将会彻底清除,无法恢复。

注意:在联机或单机情况下,该功能只能实现当前地图,当前房间数据的临时存储,房间关闭后数据就会丢失。

           验证数据存储的正确性,必须在云服环境下(确保在云服房间内)才可正确的获取到所存储的数据,在单机或者联机下将无法获取到云服下的全部数据。

 

如何开启K/V存储和排行榜

开发者可以在开发者工具->触发器->变量库->全局变量中,通过选择排行榜或者表来进行存储两种类型的数据。如图所示:

 
针对排行榜及表进行存取操作,开发者可在开发者工具->触发器->动作->数据存储中选择需要执行的操作动作,具体的操作动作,如下图所示:
  • 在排行榜中设置玩家的数值: 通过玩家的迷你号设置该玩家在排行榜中的数值。
  • 在排行榜中设置指定名称的数值:通过具体的名称,设置该名称在排行榜中的数值。
  • 在排行榜中删除玩家的值:通过玩家的迷你号删除该玩家在排行榜中的值。
  • 在排行榜中删除指定名称的值:在排行榜中删除指定的排名的所有内容。
  • 使排行榜中指定玩家的值自运算:通过玩家的迷你号获取到该玩家的值,并使值进行自运算。
  • 使排行榜中指定名称的值自运算:特定名称在排行榜中的值,并使值进行自运算。
  • 获取排行榜中指定排名的值:通过设定的排名,获取该排名下的值。
  • 获取排行榜中指定玩家的值:通过玩家迷你号,获取该玩家在排行榜中的值。
  • 获取排行榜中指定名称的值:通过指定的名称,获取该名称在排行榜中的值。
  • 在表中设置指定名称的任意值:在k/v存储(普通数据集)表中设置指定名称的值。
  • 在表中删除指定名称的值:在k/v存储(普通数据集)表中删除指定名称的值。
  • 获取表中指定名称的值:在k/v存储(普通数据集)表中获取指定名称的值。
  • 清空表:将k/v存储(普通数据集)表中的数据全部清除。
  • 清空排行榜:将k/v存储(普通数据集)表中的数据全部清除。
 
具体的实现方式,可参考排行榜教程
另外也可通过LUA脚本的方式来调用该功能,具体的脚本可参考排行榜LUA脚本教程
 
 

存储限制

系统为保障存/取数据过程顺利,会对数据存储设定一些限制,以便给与玩家最好的体验。如果超过设定的限制,玩家数据将会存在丢失的风险。
 
每个游戏内的请求服务器的上限,系统会根据同时在线的玩家数量来动态调配,允许一定数量的数据存/取请求(更多的玩家意味有更高的配额更多的数据),具体的如下表:
 
请求类型 函数 每分钟请求上限 备注
获取 getDataListByKey
30 + numPlayers × 10 每分钟该函数允许被请求的次数,超过上限将会被限制请求
设置
removeDataListByKey
30 + numPlayers × 10

所有列出的函数共享此限制

每分钟这些函数被请求的次数之和不能超过上限,否则请求将会被限制

有序数据集(排行榜) 5 + numPlayers × 2

所有列出的函数共享此限制

每分钟这些函数被请求的次数之和不能超过上限,否则请求将会被限制

 

 

数据长度限制

除了请求频率,数据存储同时也会限制每个条目可使用的数据量。其中键(key)、名称和数据都需要在一定的字符长度内,存储的数据量也有限制。具体的限制,如下表:
 
组成 最大字符数 备注
l键(key) 50 键(key)建议控制在50字符以内
名称 50 名称建议控制在50字符以内
数据 2,000,000 数据建议控制在2,000,000字符以内
 
由于键、名称是字符串,因此可以使用 string.len() 检查它们的长度。数据也保存为数据存储中的字符串,不管其初始类型如何,我们都可以使用 Lua 数据转换为序列化 JSON 表的 JSONEncode() 函数检查数据的大小。
 
 

最佳实践

Q:执行set操作,出现请求失败

A:1、避免出现服务器CD限制,相同key的set操作需要间隔>=6s,避免同一秒多次set相同key的情况,导致数据没有保存成功。

2、避免无变化的数据,仍不停去执行set操作。给需要保存的数据设置needSave之类的布尔值标签,数据变化了设置为true,定时保存中根据needSave为true时候发送set请求保存,否则没必要发送到服务器。

3、避免绑定玩家行走、碰撞等高频行为而触发实时读写操作,否则一个玩家有可能一秒内触发数百个数据读写请求。

4、避免触发每分钟请求数QPM限制。

5、妥善处理set或get返回失败的情况,可以创建请求失败列,合理安排时机重试几次,一旦成功就从失败列表移除。

 

Q:一个游戏可以设置多个排行榜

A:1、一个游戏可以包括多个维度的排行榜,如:得分排行榜,击杀Boss次数排行榜,速度排行榜,时长排行榜,技能点数排行榜等。

2、如果游戏里有多个排行榜,每个榜的刷新时间要错开。

 

Q:排行榜最多可以设置多少位排名?

A:1、单个排行榜最多可存储1万名。

2、建议排行榜展示名次最好不要超过TOP 30,最多展示前100名。展示的名次越多,参与排行的人数越多,越影响性能,导致响应变慢;设计的时候需要做合理的取舍。

 

Q:如何合理的进行set,get操作?

A:1、避免零值(或初始值)参与排行榜,会出现所有玩家都进行set操作了一次。

2、避免低于排行榜最后一名的数据也set操作。假设你的排行榜展示前50名,如果第50名已经有100分了,那么对于分数低于100分的玩家就无需添加到排行榜里面去。

3、参与排行的数值,比如经验,等级,杀怪数量等,这几个数值可以序列化成json字符串保存在一个kv中,避免多次拉取数据的情况。

4、假设某游戏有经验,等级,杀怪数3个排行榜,那么可以一个玩家一个json保存在kv表里面,key为玩家uin,value为json:

{"exp": 888999,"lvl": 7,"kmonster": 39}

5、区分游戏商店购买、任务、成就等模块的配置和需要持久化的状态数据。

 

Q:配置文件建议不设置到数据储存中

A: 通用配置可以放脚本或另外一个全局表里,没有必要存储在kv表里。

"FindMaHongJun_5":{"questName":"FindMaHongJun_5","questProg":0,"questProgAll":1,"questSta":"no"}

这种可以简化,假设TaskID:10086表示该任务,那么

"10086":[0,1,0]

数组第1个元素表示questProg,第2个元素表示questProgAll,第三个元素表示questSta。

 

 

 

 

Demo示例

本案例主要使用LUA脚本的方式实现K/V存储和排行榜保持数据功能
游戏规则说明:玩家进入游戏杀怪获得10分,被怪物击杀则扣5分,按照得分从高到低进行排序,排行榜展示前3名玩家信息。

 

 

游戏逻辑说明:
  1. 玩家进入查询自己在排行榜中的排名情况。
  1. 没有排名,则查询用户信息表中存储的用户得分,排名情况。
  1. 游戏开始后,每隔30秒向服务器上传数据。
  1. 点击排行榜按钮,请求排行榜最新数据,展示在界面。
  1. 游戏结束,或者玩家离开 将信息提交到排行榜,和用户信息表中。

 

 

实现步骤:
 
  1. 变量库配置排行榜表,玩家信息表。
         在开发者工具 -> 变量库 -> 全局变量 ->新增变量 在弹窗中选择“排行榜”,“表”
 
创建排行榜:
在全局变量中新增的排行榜中,将名称命名为“分数排行榜”,脚本引用名称设置为“rank_yang_001”, 后面lua脚本中将会使用它,进行获取云端排行榜数据。
 
 
创建玩家信息表:
在全局变量中新增的表中,将名称命名为“玩家信息表”,脚本引用名称设置为“user_yang_001”,后面lua脚本中将会使用它,进行获取云端玩家信息数据。
 
在私有变量中创建一个数值私有变量用于存放得分,一个字符串私有变量用于存放排名名称。
 
创建score得分私有变量:
 
变量类型:数值, 变量名称设置为“score”,默认值为0。变量名score将在lua脚本中被使用。
创建rank排名名次私有变量:
变量类型:字符串, 变量名称设置为“rank”,默认值为"暂未上榜"。变量名rank将在lua脚本中被使用。
 
 
 
  1. 设置界面显示
         创建2个界面,一个只有排行榜操作的按钮,此处使用奖杯代替;一个是包含具体排行榜的列表。如下图:
 
 
 
  1. 设置游戏中的击杀触发器
          在触发器中,创建一个击杀触发器,用于击杀了怪物,玩家的私有变量score增加 10分。
 
在触发器中,创建一个被击杀触发器,用于被怪物击杀时,玩家的私有变量减5分。
 
此处增加了一个条件“如果我玩家的值低于5”则不用再减,避免出现负数的分数
 
 
 
  1. 开发者工具中新增脚本
         在开发者工具中的脚本中,创建一个脚本,用于处理玩家进入游戏请求自己的数据,以及排行榜数据,定时30秒上传玩家数据,离开游戏,结束游戏时上传玩家数据的脚本。
 
详细的脚本及解释说明如下,开发者可以根据自己的情况修改脚本中的变量,以便实现自己的逻辑。
 
--定义一个收集玩家的数组
local userAll ={}
local isOver = false
--用于记录当前进入的玩家迷你号
local current_enter_player_id = 0


--获取云服中存储的玩家用户信息回调
--ret   返回结果
--k    当前的迷你号
--v    当前的用户信息表中返回的内容,实例中的格式为: rank:2 score:120

local get_UserData_callback =  function(ret,k,v)
    if ret == true then
        
                --拿到数据后,进行字符串分割
                local myValue = v
                print('当前获取到的用户信息' ..myValue )
                
                local my_rank, my_score = string.match(myValue, 'rank:([0-9]+)score:([0-9]+)')
                
                if(my_rank == 0 and my_score == 0 )then
                    print('用户信息表中活动到的数据得分为0,初始值不处理')
                    return
                end
                
                --当前玩家的迷你号
                local objid=tonumber(k)         
        local actionattr=3    --变量类型:数值
        --score为变量库中命名的得分,开发者可以根据自己在变量库中设定的内容,进行修改此处
        local msg="score"     
        
        --设置私有数值“score”的值为my_score
        local score_result = VarLib2:setPlayerVarByName(objid,actionattr,msg,my_score)
        if(score_result == ErrorCode.OK)then
            print('设置私有数值“score”的值为my_score  成功~~~~')
        else
             print('设置私有数值“score”的值为my_score  失败~~~~')
        end
        
                local rank_actionattr=4          --变量类型:字符串
                 --rank为变量库中声明的排行榜,开发者可以根据自己在变量库中设定的内容,进行修改此处变量名
        local rank_msg="rank"   
        
        --设置私有数值“rank”为my_rank
        local rank_result = VarLib2:setPlayerVarByName(objid,rank_actionattr,rank_msg,my_rank)
        if (rank_result ==  ErrorCode.OK)then
            print('设置私有数值“rank”为my_rank  成功~~~~')
        else
            print('设置私有数值“rank”为my_rank  失败~~~~')
        end
        else
                print('返回用户信息数据失败')
        end
end


--请求用户信息表中的数据
local getUserTableInfo = function()
    
    --user_yang_001 为变量库中 创建的 用户信息表的脚本索引名称,开发者根据自己的设定进行修改
    local libvarname = 'user_yang_001'
    --将当前进入游戏的玩家迷你号作为请求条件
    local str_player_id = tostring(current_enter_player_id)
  
    --获取玩家的用户信息
    local ret = CloudSever:getDataListByKey(libvarname,str_player_id,get_UserData_callback)
    if ret == ErrorCode.OK then
        print('game 中请求玩家用户数据成功')
    else
         print('game   请求求玩家用户数据失败')
    end
   
end



--获取自己的排名情况返回函数
--ret 返回结果
--k 是迷你号
--v  是得分
--ix 是排名

local get_my_data_callback = function(ret,k,v,ix)
   
    if ret == true then
        --获取数据成功
        local actionattr=3      --变量类型:数值
        --score为变量库中命名的得分,类型为数值
        local msg="score"--变量名
        
        --获取到服务器端的“score”的值,赋值给本地私有变量score
        local  numb_player_id = tonumber(k)
        
        local my_score = v
        
        --设置当前玩家的私有变量:score得分数据,开发者可以根据自己的设定名称进行更改
        local myscore_result = VarLib2:setPlayerVarByName(numb_player_id,actionattr,msg,my_score)
        if myscore_result ==  ErrorCode.OK then
            --设置成功
            print('game 中 设置得分成功...')
        else
            --设置失败
             print('game 中 设置得分失败...')
        end
        
        local actionattr_rank=4         --变量类型:字符串
        --rank 为变量库中命名的排名,类型为字符
        local msg_rank="rank"       --变量名,可修改
        --获取私有数值“rank”的值,为myrank
        local myrank = ix
        if ix == nil or ix == 0 then
            myrank = "暂未上榜"
        end
        
        local myrank_sult = VarLib2:setPlayerVarByName(numb_player_id,actionattr_rank,msg_rank,myrank)
        if myrank_sult ==  ErrorCode.OK then
            --设置成功
             print('设置排名成功...')
        else
            --设置失败
             print('设置排名失败...')
        end
    else
        --没有获取到信息,则从用户信息表中获取
         getUserTableInfo()
    end
end


--设置目前最新的本地数据到云端排行榜
--new_value: 当前得分
--pl_id: 当前玩家迷你号

local function setNewDataToCloud(new_value,pl_id)
    local libvarname = 'rank_yang_001'
    local player_id = tostring(pl_id)
    
        local ret = CloudSever:setOrderDataBykey(libvarname,player_id,new_value)
        
    if ret == ErrorCode.OK then
                print('Game中  setNewDataToCloud设置排行榜值成功 玩家ID  = ' .. player_id .. '当前得分: ' .. new_value)
        else
                print('Game中  setNewDataToCloud设置排行榜值失败')
    end
end


--给用户信息表上传数据
--user_id  玩家迷你号
--user_rank   当前排行
--user_score    当前得分

local function setUserInfoDataCloud(user_id,user_rank, user_score)
    
    --user_yang_001 为变量库中定义的用户信息表的 脚本引用名称,开发者可以根据自己的设定,修改此名称
    local libvarname = 'user_yang_001'
    --将数据组合成 rank:20 score:120  格式进行保存
    local  m_text = 'rank:'.. user_rank .. 'score:'.. user_score
    local uid = tostring(user_id)
    --调用接口,进行保存信息到云端的用户信息表中
        local ret = CloudSever:setDataListBykey(libvarname,uid,m_text)
    if ret == ErrorCode.OK then
                print('setUserInfoDataCloud设置用户信息值成功 保存信息:' .. m_text)
        else
                print('设置用户信息值失败')
    end
end


--离开和结束公共的设置玩家信息方法
--pl  为迷你号

local function setUserInfoAll(pl)
    
    --如果传来的参数为空,则直接终止
    if pl == nil then
        return
    end
    
    local num_palyer_id = tonumber(pl)
    local actionattr=3--变量类型:数值
    --score为变量库中定义的得分,开发者可以根据自己的设定内容,进行修改此处变量名
    local msg="score"
    
    --获取私有数值“score”的值,赋值给value
    print('Game中 setUserInfoAll中  玩家迷你号==' .. num_palyer_id )
    local result,value = VarLib2:getPlayerVarByName(num_palyer_id,actionattr,msg)
    if(result == ErrorCode.ok)then
        print('Game中   setUserInfoAll中获取数据本地数据前,value==' .. value .. ' num_palyer_id==' .. num_palyer_id )
    end
    
 
    -- 获取私有排行榜
    --rank为变量库定义的排行榜,开发者可以根据自己的设定内容,进行修改此处变量名
    local msg2="rank"
    local actionattr2=4    --变量类型:字符串
    
    local result2,re_rank = VarLib2:getPlayerVarByName(num_palyer_id,actionattr2,msg2)
    if (value ~= nil and re_rank ~= nil and value ~= 0 )then
        --当前得分不是0,即不是初始值
          
        --如果自己的本地数据比最后一名的得分都高,则将分数上传到排行榜服务器.
        --如果分数小于最后一名的得分,则没有必要上传到服务器的排行榜,只需要在离开,或者游戏结束的时候将信息上传到用户信息中即可
        setNewDataToCloud(value,pl)
    
        local str_rank = re_rank
        if(re_rank == "暂未上榜")then
            str_rank = 0
        end
      
        --设置到用户信息表
        if isOver == true then
            --如果是离开游戏,或者游戏结束,则向服务器上传用户信息进行保存
            setUserInfoDataCloud(pl,str_rank, value)
        else
            print('Game中  定时器中,不需要设置用户信息,设置了排行榜就可以了')
        end
    
    else
       --这里就是初始化的时候,无需处理
       print('Game中 获取本地私有变量数据都为空的时候,说明本地没有数据' )
    end
end


--玩家进入游戏,获取排名,获取玩家信息,并设置本地数据rank,score
local function the_EnterGame_callback(e)
    
    local pl = e.eventobjid
    table.insert(userAll,pl)
    --将当前进入玩家迷你号,临时存在变量中,后面回调函数中使用
    current_enter_player_id = pl
    
 
    
   
    --rank_yang_001 为设置的排行榜中脚本的引用名称,开发者可以根据自己的设定,进行修改此命名
    local libvarname = 'rank_yang_001' 
    -- 请求当前进入玩家的排行榜数据
    local my_ret = CloudSever:getOrderDataByKey(libvarname,pl,get_my_data_callback) 
    if my_ret == ErrorCode.OK then
        print('请求自己的排行榜数据成功my_ret == ErrorCode.OK')
    else
        print("请求自己的排行榜数据失败")
        --没有自己的排行榜,则需要去用户信息表中获取信息,进行展示
        getUserTableInfo()
    end
    
end


--{{{ 游戏开始后,时钟每(30ms)执行一次 ,向服务器排行榜进行上传玩家的数据
--[==[
--]==]
--}}}

local function dingShiSetDataForCloud(e)
    local current = e.second
    
    --定时30秒上传一次数据到云端
    if(current ~= nil and current >=30  and (current- 30)%30==0) then
        
       for kv, v in ipairs(userAll)do
           
            setUserInfoAll(v)
       end
    end
end

--如果比赛结束,将玩家的信息保存到云端(排行榜和用户信息表)
local function thegame_end_callback()
   
    isOver = true
    for kv, v in pairs(userAll)do
        setUserInfoAll(v)
    end
    
end

local function the_TeaveGame_callback(e)
    local pl = e.eventobjid
    isOver = true
    setUserInfoAll(pl)
    --从本地数据中移除离开玩家的uin
    table.remove(userAll,pl)
    
end

--向服务器提交数据
ScriptSupportEvent:registerEvent("Game.RunTime",dingShiSetDataForCloud)

--监听游戏结束的事件
ScriptSupportEvent:registerEvent([=[Game.End]=], thegame_end_callback)

--监听玩家离开事件
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.LeaveGame]=], the_TeaveGame_callback)

--监听玩家进入
ScriptSupportEvent:registerEvent([=[Game.AnyPlayer.EnterGame]=], the_EnterGame_callback)

 
 
  1. UI编辑器中新增脚本
         在UI编辑中,在第一个仅有"奖杯"的界面的脚本中,创建一个脚本,用于处理玩家点击奖杯请求自己的排行榜情况,以及最新的排行榜数据。返回的排行榜数据中,包括:玩家昵称,玩家排名,玩家得分数据。
 
详细的脚本及解释说明如下,开发者可以根据自己的情况修改脚本中的变量,以便实现自己的逻辑。
--用于存放当前点击的玩家迷你号
local current_click_player_id = 0
--用于存放获取到的云端数据
local cloud_data = nil

--昵称文本控件ID
--开发者可以修改为自己的排行榜界面中第一、二、三...名昵称称控件ID
local txt_name_id = {
  [1] = '7124235295204530136_13',
  [2] = '7124235295204530136_16',
  [3] = '7124235295204530136_17',
}

--得分文本控件ID
--开发者可以修改为自己的排行榜界面中第一、二、三...名得分控件ID
local txt_score_id = {
  [1] = '7124235295204530136_14',
  [2] = '7124235295204530136_18',
  [3] = '7124235295204530136_19',
}



--统一设置第一名~第三名的数据展示
--开发者可以再此处设置自己的排行榜界面数据

local  function setNewDataForUI()
    if(cloud_data ~= nil)then
        local v_value = cloud_data
        local uiid="7124235295204530136" 
        --将当前点击的玩家迷你号,转换为数值类型
        local nu_current_player_id = tonumber(current_click_player_id)
        for ix,  v in ipairs(v_value) do
            local v_score = v.v
            local current_name = v.nick   --这里为获取玩家昵称,开发者可以直接通过v.nick获取到存储在排行榜中对应玩家的昵称
            Customui:setText(nu_current_player_id,uiid,txt_score_id[ix], v_score)
            Customui:setText(nu_current_player_id,uiid,txt_name_id[ix], current_name)
        end
    end
end



--请求排行榜返回的数据
local get_now_data_callback = function (ret,value) -- 返回结果不一定有排名
 
    if ret ~= false  and  value ~= nil then
        --设置排行榜中的界面数据
        --将获取到的数据进行临时存储,以便后面使用
        cloud_data = value
        
        --测试
        setNewDataForUI()
        --获取到了数据,开始将数据显示到界面层
        --setUIData()
        
        --有了数据后,显示排行榜界面
        local result = Player:openUIView(current_click_player_id,'7124235295204530136')
        
    end    
end



--设置玩家自己的数据,展示在界面

local function setMy_Data_InLocal()
    
     --当前需要设置的界面ID,7124235295204530136为排行榜所显示的界面ID,开发者根据自己的界面ID进行修改此处
     local uiid="7124235295204530136" 
     --7124235295204530136_21 为排行榜中排行的控件ID,开发者根据自己的控件ID修改此处
     local element_rank_id='7124235295204530136_21'
      --7124235295204530136_24 为排行榜中玩家的名称的控件ID,开发者根据自己的控件ID修改此处
     local element_nick_id='7124235295204530136_24'
    
 
     local numb_player_id = tonumber(current_click_player_id)
     --获取变量值
    
     local actionattr=3--变量类型:数值
     ----score为变量库中设置的得分名称,开发者可以根据自己的设置进行修改此处
     local msg="score"
     --获取私有数值“score”的值,赋值给value
     local myscore_result,value = VarLib2:getPlayerVarByName(numb_player_id,actionattr,msg)
     if (myscore_result ==  ErrorCode.OK) then
         print('请求玩家的得分数据正确,得分 ==' .. value)
     else
         print('请求玩家的得分数据出错')
     end
     
    local rank_actionattr=4    --变量类型:字符串
    --rank 为变量库中设置排行名称,开发者可以根据自己的设置进行修改此处
    local rank_msg="rank"--变量名
    
     --获取私有数值“rank”的值,赋值给value
    local my_rank_result,my_rank_value = VarLib2:getPlayerVarByName(numb_player_id,rank_actionattr,rank_msg)
    if(my_rank_result == ErrorCode.OK) then
         print('请求玩家的排名数据正确 my_rank_value==' .. my_rank_value)
         
    else
         print('请求玩家的排名数据出错')
    end
    
    
    --开始设置私有数据到界面
    --7124235295204530136_27为界面层 得分的控件ID,开发者可以根据自己的界面,设置控件ID
    local element_score_id='7124235295204530136_27'
    
    local set_score_result = Customui:setText(numb_player_id, uiid, element_score_id, value)
    if set_score_result == ErrorCode.OK then
        print('UI脚本中设置自己的得分成功score_value=' .. value)
    else
        print('UI脚本中设置自己的 得分失败 score_value=' .. value)
    end
    
    --设置名字
    local name_result, my_name = Player:getNickname(numb_player_id)
    local set_name_result = Customui:setText(numb_player_id,uiid,element_nick_id, my_name)
    if(set_name_result == ErrorCode.OK)then
        print('脚本中,设置自己的名称成功my_name ==' .. my_name)
    else
        print('脚本中,设置自己的名称成功')
    end
    
    --设置排名
    if(my_rank_value == 0  or my_rank_value == nil) then
        my_rank_value = "暂未上榜"
    end
    
    local rank_set_result = Customui:setText(numb_player_id,uiid,element_rank_id, my_rank_value)
    if rank_set_result == ErrorCode.OK then
        print('UI脚本中   自己的排行榜设置正常 rank_value .. ' .. my_rank_value)
    else
        print('UI脚本中   自己的排行榜设置失败 rank_value .. ' .. my_rank_value)
    end
    
end

--奖杯点击事件
--开发者可以设置自己的排行榜按钮事件

local function jiangbei_click(e)
    local pl = e.eventobjid
    
    --是不是自己设置的排行榜按钮,如果不是就直接不处理
    --7124254390629128152_1 为界面层上排行榜按钮,用于点击,开发者根据自己的排行榜按钮进行修改此处
    if( e.btnelenemt ~= '7124254390629128152_1')then
        return
    end
    
    --当前点击的玩家迷你号,用于回调的时候使用
    current_click_player_id = pl

    -- rank_yang_001 为变量库中设置的排行榜表的,脚本接口引用名称,开发者根据自己的设置,修改此处
    local libvarname = 'rank_yang_001' 
    

    --玩家进入游戏,请求从大到小排序的前3名的数据;如果需要从小到大的排序,则将-3修改为3. 
    --开发者可以根据自己的设置的排行榜一共是多少名来设置该数字,直接取到前面多少名。
    local ret = CloudSever:getOrderDataIndexArea(libvarname,-3,get_now_data_callback) 
    if ret == ErrorCode.OK then
        
        print('请求排行榜数据成功ret == ErrorCode.OK')
    else
        print("请求排行榜数据失败")
    end
    
    --设置进入的玩家自己的信息
    setMy_Data_InLocal()
end


--监听点击事件
ScriptSupportEvent:registerEvent([=[UI.Button.Click]=],jiangbei_click)
 

 

开发者可以按照以上步骤,拷贝相应的LUA脚本运行Demo。通过此Demo对排行榜的使用有一个更加深入的了解,在此基础之上,开发者可以设计、增加自己的游戏逻辑,使得地图玩法更加丰富。
站点有内容要更新是否更新。
更新
忽略