事先说明:
此篇文章重在介绍:"操前准备",实际操作会在下篇介绍.
里面用的游戏开发引擎是unity,使用腾讯云游戏对战引擎,接入得是腾讯云中得日志服务CLS.
此操作得用处:
游戏联机对战引擎 MGOBE 的采集的实时服务器日志将上报到 日志服务 CLS,开发者可登录 日志服务控制台 查看。
那么我们首先该怎么使用呢?如果你只是想尝试一下产品的话,那么你可以登陆 这个网址 中查看免费的使用.如果觉得合适,你就可以付费使用.
登陆这个网址之后会见到如下界面:
如果你想要去看其他的产品,点击对应的按钮即可,那么这里,我来演示一下如何接入腾讯云游戏对战引擎 MGOBE,并获取里面的日志消息.
首先我们点击腾讯云游戏对战引擎 MGOBE的按钮
进到介绍:如何使用实时服务器日志,那么在使用之前,得有两个必要条件,首先是要有一个游戏在腾讯云中正在跑,还有一个必要条件就是你已经有了一个实力得服务器,如果你没有,那也不用担心,腾讯云会给你一个可以使用得示例服务器,也可以拿来测试一下.
那么首先,我们先开通并创建一个游戏服务:
在腾讯云的官网上直接搜索:"对战引擎",第一个就是,点击立即使用就可以来到控制台,如果你是第一次使用,那么它会提示你一些需要勾选一些条款.勾选之后,你就可以新建一个自己的游戏了
那么选择你要做的游戏,每一种游戏提供的服务是不一样的.我这里选择的是unity类型的游戏,建好了之后,会看到具体的信息:
最重要的就是前3个信息,一定要保存好,不能泄露,如果泄露了,别人会根据你的这个信息来使用你的流量.当我做完这个功能,我就会删除这个游戏,大家也不用记录.
里面的计费方式:
游戏联机对战引擎 MGOBE 于2019年8月12日正式开启公测,用户在此期间可免费使用。免费期限截止于2019年12月31日,从2020年1月1日开始正式计费。
游戏联机对战引擎 MGOBE 按游戏 DAU 以及流量用量计费,日结后付费。
您可以在游戏联机对战引擎 MGOBE 的控制台内使用云开发 TCB 服务,TCB 的计费与 MGOBE 相互独立。
付费类型 | DAU 范围 | 单价(元/DAU/日) |
---|---|---|
国内站价格 | ||
DAU ≤ 500 | 0 | |
500 < DAU ≤ 8000 | 0.0031 | |
8000 < DAU ≤ 2W | 0.0027 | |
2W < DAU ≤ 5W | 0.0025 | |
5W < DAU ≤ 10W | 0.0024 | |
DAU > 10W | 联系商务报价 |
注意:
游戏联机对战引擎 MGOBE 活动期间(从即日起至2021年12月31日)向您赠送部分流量,赠送规则如下:
付费类型 | 单价(元/GB) |
---|---|
国内站价格 | 0.8 |
注意: 上述所有“流量”均表示出流量;入流量不产生流量费用。
某游戏一天的 DAU 数据为2560,产生2GB流量。
赠送流量额度:1GB
该游戏当天的费用分为两部分:
该游戏当天产生的总费用为:6.386 + 0.8 = 7.186元
当然,如果你是一个测试的用户,那么这些免费额度足够你来测试了.
那么我们再来做第二个必要条件:实时服务器,也许,你没有这样的服务器,那你也不用担心,因为腾讯云中提供了一个完整的框架,你只需要下载并且在里面修改即可.
其实这个服务器的功能并不是要和CLS对接产生日志,其实它是一个游戏服务器的一个"扩展",比如游戏服务端拓展逻辑,如保存玩家数据,游戏状态同步等.
那么下载下来之后查看里面的文件:
需要我们自己动手修改的,大部分都在index文件中.我们先尝试着打开这个文件来查看里面的代码:
import { mgobexsInterface } from './mgobexsInterface'; const gameServer: mgobexsInterface.GameServer.IGameServer = { mode: 'sync', onInitGameData: function (): mgobexsInterface.GameData { return {}; }, onRecvFromClient: function onRecvFromClient({ actionData, gameData, SDK, room, exports }: mgobexsInterface.ActionArgs<mgobexsInterface.UserDefinedData>) { gameData.pos = Math.floor(Math.random() * 2000); SDK.logger.debug('onRecvFromClient', gameData, actionData); setTimeout(() => { SDK.sendData({ playerIdList: [], data: { data: gameData, ts: new Date().toISOString() } }, { timeout: 2000, maxTry: 3 }); SDK.exitAction(); }, gameData.pos); }, onJoinRoom: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onJoinRoom', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onCreateRoom: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onCreateRoom', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onLeaveRoom: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onLeaveRoom', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onRemovePlayer: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onRemovePlayer', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onDestroyRoom: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onDestroyRoom', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onChangeRoom: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onChangeRoom', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onChangeCustomPlayerStatus: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onChangeCustomPlayerStatus', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onChangePlayerNetworkState: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onChangePlayerNetworkState', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onStartFrameSync: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onStartFrameSync', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onStopFrameSync: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onStopFrameSync', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, onChangeRoomPlayerProfile: function ({ actionData, gameData, SDK, room, exports }) { SDK.logger.debug( 'onChangeRoomPlayerProfile', 'actionData:', actionData, 'gameData:', gameData, 'room:', room ); }, }; // 服务器初始化时调用 function onInitGameServer(tcb: any) { // 如需要,可以在此初始化 TCB const tcbApp = tcb.init({ secretId: "请填写腾讯云API密钥ID", secretKey: "请填写腾讯云API密钥KEY", env: "请填写云开发环境ID", serviceUrl: 'http://tcb-admin.tencentyun.com/admin', timeout: 5000, }); // ... } export const mgobexsCode: mgobexsInterface.mgobexsCode = { logLevel: 'error+', logLevelSDK: 'error+', gameInfo: { gameId: "请填写游戏ID", serverKey: "请填写后端密钥", }, onInitGameServer, gameServer }
那么会看到里面有房间相关的,玩家状态相关的,还有一些帧同步相关的.当然,里面还有一些需要你填写你的,那么我们先把这个填好,然后再次压缩成zip文件.
部署实时服务器
登录 游戏联机对战引擎控制台,单击左侧菜单【自定义服务逻辑】>【实时服务器】。
单击【创建服务】,进入新建服务界面。
里面有几个选项需要说明的是:
设置实例数量范围,最大值为20。默认为自动调节,即在设定的实例范围内自动调节,不会超出该设定范围。
然后,点击部署,即可完成,那么到这里,我们的一个基本介绍与操前准备就完成了,那么下篇文章就来演示如何对接CLS日志服务.
1.在报名的路上,我看见远处的学校,轰!的一声没了。希望如此。 2.男:我一直...
背景 有时候我会碰到快速搭建测试服务的需求,比如像这样: 搭建一个 HTTP Servi...
本文转载自微信公众号「后端Q」,作者conan。转载本文请联系后端Q公众号。 概述 ...
1.百度是个大骗子,我抄了十几年的满分作文却从未得过满分。 2.学神在刷难题,...
前言 微服务成了互联网架构的标配模式,对微服务之间的调用的流量治理和管控就尤...
1.某女生寝室门口贴着一个告示男生与饭盒不得入内,问何解?答曰两者都会搞大女...
作者 | 楚奕 来源 | 阿里技术公众号 这篇文章主要从技术视角介绍下跨平台WebCanv...
基于阿里巴巴的互联网架构、大数据技术,利用混合云架构打造全新的云化电子税 务...
3月24日,腾讯发布2020年Q4及全年财报,其中金融科技及企业服务第四季收入385亿...
创业与投资的本质,都是追寻一种能够穿越时空,抵达未来的高效方式。 德勤管理咨...