事先说明:
此篇文章重在介绍:"操前准备", 实际操作会在下篇介绍.
里面用的游戏开发引擎是 unity, 使用腾讯云游戏对战引擎, 接入得是腾讯云中得日志服务 CLS.
此操作得用处:
游戏联机对战引擎 MGOBE 的采集的实时服务器日志将上报到 日志服务 CLS, 开发者可登录 日志服务控制台 查看.
那么我们首先该怎么使用呢? 如果你只是想尝试一下产品的话, 那么你可以登陆 这个网址 https://console.cloud.tencent.com/cls 中查看免费的使用. 如果觉得合适, 你就可以付费使用.
登陆这个网址之后会见到如下界面:
如果你想要去看其他的产品, 点击对应的按钮即可, 那么这里, 我来演示一下如何接入腾讯云游戏对战引擎 MGOBE, 并获取里面的日志消息.
首先我们点击腾讯云游戏对战引擎 MGOBE 的按钮
进到介绍: 如何使用实时服务器日志, 那么在使用之前, 得有两个必要条件, 首先是要有一个游戏在腾讯云中正在跑, 还有一个必要条件就是你已经有了一个实力得服务器, 如果你没有, 那也不用担心, 腾讯云会给你一个可以使用得示例服务器, 也可以拿来测试一下.
那么首先, 我们先开通并创建一个游戏服务:
在腾讯云的官网上直接搜索:"对战引擎", 第一个就是, 点击立即使用就可以来到控制台, 如果你是第一次使用, 那么它会提示你一些需要勾选一些条款. 勾选之后, 你就可以新建一个自己的游戏了
那么选择你要做的游戏, 每一种游戏提供的服务是不一样的. 我这里选择的是 unity 类型的游戏, 建好了之后, 会看到具体的信息:
最重要的就是前 3 个信息, 一定要保存好, 不能泄露, 如果泄露了, 别人会根据你的这个信息来使用你的流量. 当我做完这个功能, 我就会删除这个游戏, 大家也不用记录.
里面的计费方式:
游戏联机对战引擎 MGOBE 于 2019 年 8 月 12 日正式开启公测, 用户在此期间可免费使用. 免费期限截止于 2019 年 12 月 31 日, 从 2020 年 1 月 1 日开始正式计费.
游戏联机对战引擎 MGOBE 按游戏 DAU 以及流量用量计费, 日结后付费.
您可以在游戏联机对战引擎 MGOBE 的控制台内使用云开发 TCB 服务, TCB 的计费与 MGOBE 相互独立.
DAU 定价
付费类型 | 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 | 联系商务报价 |
注意:
玩家初始化成功即算作 DAU,DAU 按照一个游戏一天内的 player ID 去重计算(player ID 是游戏内用户的唯一标识符, 一个游戏内的一个用户对应一个 player ID).
DAU 计费模式为从免费额度开始, 享受累进阶梯价, 即每段 DAU 使用一个单价, 每个阶梯内的用量与该阶梯的单价相乘, 累加后得出总价.
流量定价
免费流量(活动期间)
游戏联机对战引擎 MGOBE 活动期间 (从即日起至 2021 年 12 月 31 日) 向您赠送部分流量, 赠送规则如下:
每个游戏赠送流量额度为 1GB / 天, 赠送流量仅可用于游戏联机对战引擎. 当天产生的赠送额度当天有效.
若当天流量消耗超过赠送额度, 超额部分需要按流量定价标准按量付费.
流量定价标准
付费类型 | 单价(元 / GB) |
---|---|
国内站价格 | 0.8 |
注意:
上述所有 "流量" 均表示出流量; 入流量不产生流量费用.
费用示例
某游戏一天的 DAU 数据为 2560, 产生 2GB 流量.
赠送流量额度: 1GB
该游戏当天的费用分为两部分:
DAU 费用: 500 * 0 + (2560 - 500) * 0.0031 = 6.386 元
流量费用:(2GB - 1GB) * 0.8 = 0.8 元
该游戏当天产生的总费用为: 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 文件.
部署实时服务器
登录 游戏联机对战引擎控制台, 单击左侧菜单[自定义服务逻辑]>[实时服务器] .
单击[创建服务] , 进入新建服务界面.
里面有几个选项需要说明的是:
选择是否打通 VPC 网络. 打通腾讯云的 VPC 网络, 可以访问您 VPC 下的数据库和存储, 开通后不可变更.
若您选择打通 VPC , 而 VPC 下拉菜单为空, 则您需要先去 私有网络 https://console.cloud.tencent.com/vpc/vpc?rid=4 创建一个 VPC; 建议您在上海地区创建 VPC, 如在其他地区创建, 则需通过 对等连接 实现 VPC 跨地域通信(上海和其他地区), 并为对等连接付费.
设置实例数量范围, 最大值为 20. 默认为自动调节, 即在设定的实例范围内自动调节, 不会超出该设定范围.
然后, 点击部署, 即可完成, 那么到这里, 我们的一个基本介绍与操前准备就完成了, 那么下篇文章就来演示如何对接 CLS 日志服务.
来源: https://www.qcloud.com/developer/article/1809208