搜索
热搜: 活动 交友 discuz
查看: 1661|回复: 8

[教程] 用Playfab平台做一个无代码后端

[复制链接]

54

主题

537

帖子

3407

积分

魔导师

UID
2370
金币
3406
精华
0
节操
-364

创世者隐修议员扛把子脑洞大开教程大师开拓者我是鸽手黑科技玩的6平妖侠士

发表于 2018-9-20 02:49:10 | 显示全部楼层 |阅读模式

前方高能预警!非战斗人员请尽快登录!

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
好久没写教程了-_-当了游戏策划后技术方面的东西研究的越来越少了

应该不少作者都有存读玩家数据的需求,自己撸后端不仅麻烦,需要不少技术支持,安全性也不太容易得到保证(玩家拆一下你的包就能搞出你没加密的http请求)

playfab是一个方便的自动后端平台,用户少的时候免费,注册即可使用,还拥有各种数据显示和数据分析工具。

注册后的dashboard:

可以看到功能很多,包括玩家列表,自动排行榜,经济系统监控等等,甚至有自动锦标赛
坏处也是功能太多,大部分功能我们用不到,读API很蓝瘦

本篇教程主要也是讨论哪些API是比较重要的

后续挖个坑 有些功能我还在研究 这几天写完
jc1.png

评分

参与人数 2荣誉 +7 金币 +100 创造力 +6 求知欲 +6 互助 +6 智慧 +8 节操 -4 收起 理由
Demon + 6 + 100 + 6 + 6 + 6 + 6 + 6 鸽老师牛逼!
无双 + 1 + 2 -10 合鸟老师牛逼

查看全部评分

回复

使用道具 举报

54

主题

537

帖子

3407

积分

魔导师

UID
2370
金币
3406
精华
0
节操
-364

创世者隐修议员扛把子脑洞大开教程大师开拓者我是鸽手黑科技玩的6平妖侠士

 楼主| 发表于 2018-9-20 05:50:14 | 显示全部楼层
本帖最后由 kzhang9 于 2018-10-1 17:07 编辑

最重要的3个API:

1 Login with custom id
https://api.playfab.com/document ... thod/LoginWithCustomID
用玩家的steam id登陆playfab 如果没有playfab号就为玩家创建一个 登陆后可以拿到登陆的session ticket
2 UpdateUserData 存储玩家信息
https://api.playfab.com/document ... thod/UpdateUserData
用session ticket来为玩家存储json体信息
3 GetUserData 读取玩家信息
https://api.playfab.com/documentation/Client/method/GetUserData
和2差不多

后面放例子和实战
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

Lv:1 隐谧贤者

UID
13150
金币
3
精华
0
节操
0
发表于 2018-9-21 10:27:49 | 显示全部楼层
顶一下,求后续
回复 支持 反对

使用道具 举报

75

主题

693

帖子

3010

积分

大摸导师

热爱让我们并肩

UID
4
金币
3320
精华
0
节操
-232

隐修议员

QQ
发表于 2018-9-21 19:23:59 | 显示全部楼层
等于说 先开个坑 等下就鸽
如果一个人尽可能做好能做的事情,那这个世界就一定会因为这件事情而变得更美好一点。
回复 支持 反对

使用道具 举报

54

主题

537

帖子

3407

积分

魔导师

UID
2370
金币
3406
精华
0
节操
-364

创世者隐修议员扛把子脑洞大开教程大师开拓者我是鸽手黑科技玩的6平妖侠士

 楼主| 发表于 2018-9-24 16:32:38 | 显示全部楼层
周中太忙只能周末弄弄了 又赶上感冒拖了好几天
登陆:
http request这部分真坑 很多api连官网都没有 deepprint了才能看到
CreatHTTPRequestScriptVM这个API也不能在initgamemode里直接call 目测是global还没初始化完全
下面上代码,弄了个timer3秒后在initgamemode里call的,用玩家的steamid做custom id登陆,没有steam id登陆是playfab的steam登陆很麻烦要搞各种验证
  1. Timers:CreateTimer(3, function()
  2.                 local req = CreateHTTPRequestScriptVM("POST", "https://b438.playfabapi.com/Client/LoginWithCustomID")
  3.                 req:SetHTTPRequestHeaderValue("Content-Type", "application/json")
  4.                 local encoded = '{"CustomId": "'..tostring(PlayerResource:GetSteamID(0))..'","CreateAccount": true,"TitleId": "B438"}'
  5.        
  6.                 req:SetHTTPRequestRawPostBody("application/json",encoded)
  7.                
  8.             req:Send(function(res)
  9.                 print("[STATS] Received", res.Body)
  10.                         local resbody = json.decode(res.Body)
  11.                         local data=resbody["data"]
  12.                 local session_ticket=data["SessionTicket"]
  13.                 local playfab_id=data['PlayFabId']
  14.                 print(session_ticket)
  15.             end)
  16.         end)
复制代码

比较粗糙,不过能用……
13.png
可以看到print出了session ticket
代表玩家成功登陆
去我们的playfab控制台看看
14.png
好的 成功记录了
之后就是读写数据了 后面再写
回复 支持 反对

使用道具 举报

54

主题

537

帖子

3407

积分

魔导师

UID
2370
金币
3406
精华
0
节操
-364

创世者隐修议员扛把子脑洞大开教程大师开拓者我是鸽手黑科技玩的6平妖侠士

 楼主| 发表于 2018-10-1 17:06:25 | 显示全部楼层
获得数据和更新数据的代码我就全放这了
感兴趣的可以自己看
具体逻辑是 login后会get数据 如果数据不存在就update新数据(新玩家创建)
update和get函数可以在游戏里的其他地方随时调用 存好session ticket即可

  1. function player_database:login(rep)
  2.     --login
  3.     local req = CreateHTTPRequestScriptVM("POST", "https://b438.playfabapi.com/Client/LoginWithCustomID")
  4.         req:SetHTTPRequestHeaderValue("Content-Type", "application/json")
  5.         --local encoded = '{"CustomId": "'..tostring(PlayerResource:GetSteamID(0))..'","CreateAccount": true,"TitleId": "B438"}'
  6.         local encoded = '{"CustomId": "'..tostring("AMHCtester")..'","CreateAccount": true,"TitleId": "B438"}'
  7.         req:SetHTTPRequestRawPostBody("application/json",encoded)
  8.                
  9.     req:Send(function(res)
  10.                --print("[STATS] Received", res.Body)
  11.                 local resbody = json.decode(res.Body)
  12.                 local data=resbody["data"]
  13.                local session_ticket=data["SessionTicket"]
  14.                local playfab_id=data['PlayFabId']
  15.                    print(session_ticket)
  16.                 PlayerData[0]={}--init player data
  17.                 PlayerData[0][0]=session_ticket  --store session ticket
  18.                 player_database:getplayerdata(session_ticket)
  19.     end)
  20. end

  21. function player_database:getplayerdata(session_ticket)
  22.     --login
  23.     local req = CreateHTTPRequestScriptVM("POST", "https://b438.playfabapi.com/Client/GetUserData")
  24.         req:SetHTTPRequestHeaderValue("Content-Type", "application/json")
  25.         req:SetHTTPRequestHeaderValue("X-Authentication", session_ticket)
  26.         local encoded = '{"Keys": ["Gold","TimeSaved"]}'
  27.        
  28.         req:SetHTTPRequestRawPostBody("application/json",encoded)
  29.                
  30.     req:Send(function(res)
  31.                print("[STATS] Received", res.Body)
  32.                 local resbody = json.decode(res.Body)
  33.                 local data=resbody["data"]
  34.                 local datadata=data["Data"]
  35.                 local gold=datadata["Gold"]

  36.                 if gold==nil then                        --First time player
  37.                         player_database:updateplayerdata(session_ticket,0)
  38.                 else
  39.                         print("current gold is")
  40.                         local goldnum=tonumber(gold["Value"])
  41.                         PlayerData[0][1]=goldnum
  42.                 end
  43.     end)
  44. end

  45. function player_database:updateplayerdata(session_ticket, goldnum)
  46.         --login
  47.         print(goldnum)
  48.     local req = CreateHTTPRequestScriptVM("POST", "https://b438.playfabapi.com/Client/UpdateUserData")
  49.         req:SetHTTPRequestHeaderValue("Content-Type", "application/json")
  50.         req:SetHTTPRequestHeaderValue("X-Authentication", session_ticket)
  51.         local encoded = '{"Data":{"Gold": '..(tostring(goldnum))..',"isPayed": true},"Permission": "Public"}'
  52.        
  53.         req:SetHTTPRequestRawPostBody("application/json",encoded)
  54.                
  55.     req:Send(function(res)
  56.                print("[STATS] Received", res.Body)
  57.                 local resbody = json.decode(res.Body)
  58.                 local data=resbody["data"]
  59.                local dataversion=data["DataVersion"]
  60.                    print(dataversion)
  61.     end)
  62. end
复制代码
回复 支持 反对

使用道具 举报

0

主题

9

帖子

430

积分

Lv:3 空明术士

UID
8879
金币
189
精华
0
节操
0
发表于 2019-1-5 14:02:41 | 显示全部楼层
感谢,帮助很大。
回复 支持 反对

使用道具 举报

4

主题

6

帖子

337

积分

Lv:3 空明术士

UID
12643
金币
134
精华
0
节操
0
发表于 2019-1-21 20:09:08 | 显示全部楼层
请问一下刀塔自走棋用什么后端
回复 支持 反对

使用道具 举报

0

主题

4

帖子

92

积分

Lv:1 隐谧贤者

UID
2639
金币
171
精华
0
节操
-1
QQ
发表于 2019-1-23 09:30:36 | 显示全部楼层
uway 发表于 2019-1-21 20:09
请问一下刀塔自走棋用什么后端

自用服务器,先出图吧,有图你在考虑服务器的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|Archiver|手机版|小黑屋|AMHC!dota2rpg~ ( 闽ICP备14009209  

GMT+8, 2019-3-19 07:36 , Processed in 0.193615 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc. Theme.Yeei

快速回复 返回顶部 返回列表