需求背景
最近在使用华为多人对战服务做联机游戏,我们游戏使用的是房间匹配的组房类型,希望在业务低谷时通过机器人填充房间。这里说的机器人指的是在游戏客户端实现的AI逻辑,同一个游戏房间内,所有真人玩家使用相同的机器人信息,比如名称、能力值等。
看了官方文档上目前只有在线匹配场景有明确机器人逻辑,对于房间匹配如何添加机器人并未提及,这里提供一种解决方案。
能力分析
官网关于房间匹配的介绍:
“根据传入的参数,优先加入符合条件且最先创建的对战房间中。若未匹配到符合条件的房间,云侧服务器会为玩家自动创建一个符合条件的房间,并默认当前玩家为该房间房主。此种方式主要适用于根据房间类型进行匹配的游戏场景,例如,新手区、高手区等。”
官网关于房间匹配接口配置:
global.client.matchRoom({
matchParams: { // 自定义匹配参数,最多支持5条
param1: 'xxxx',
param2: 'xxxx',
},
roomType: 'xxxx', // 房间类型,比如“高手区”、“菜鸟区”
customRoomProperties: 'xxxx',
maxPlayers: 2,
},{customPlayerStatus: 0, customPlayerProperties: ''}).then((room) => {
// 房间匹配中
global.room = room;
global.player = room.player;
}).catch((e) => {
// 房间匹配失败
});
复制
从以上可以看到,房间匹配场景下,服务端不会主动给房间添加机器人,只能在发起匹配时带上机器人属性了。从接口配置可以看到,要满足同一个房间内机器人信息的唯一和所有玩家可见,customRoomProperties可以利用,进房后真实玩家获取房间自定义属性中的机器人信息进行本地设置,保持房间内统一。
解决方案
本游戏一局内有4个玩家,每次玩家发起房间匹配时,结合玩家自身能力值生成3个机器人对象,并将3个机器人信息放置到matchRoom接口的customRoomProperties中,房间匹配成功后,会按照房主(首个进房间的玩家)的customRoomProperties来设置房间自定义属性。
玩家发起房间匹配后,接口会返回room实例,房主本地开始计时,如30s内房间内玩家凑够4人,则房主开启游戏。30s后仍无法凑齐4人,则从房间属性获取相应个数机器人补齐缺失玩家位置,然后开始游戏。
Tips:有个小坑,这里的机器人是纯客户端强加进来的,华为后台不感知,所以即使游戏开始,这个房间在华为后台也仍然是人数不满的,有可能存在其他真实玩家通过房间号加入到这个房间,或者在30s等待时间结束时正好匹配进房的问题,这种场景需要特殊处理一下,即当玩家加入房间后先判断一下房间状态,如果已游戏已开始则自行退出该房间,其他玩家也监听OnJoin事件,游戏开始后收到的新加入的玩家不在游戏内处理。
官方文档地址:
https://developer.huawei.com/consumer/cn/agconnect/gameobe
若有疑问,可以提单联系华为技术支持咨询。在线提单地址:
https://developer.huawei.com/consumer/cn/support/feedback/#/add/89?level2=201650609502456486