服务端如何做数据缓存

[复制链接]
1261 |12
打工人小棋 发表于 2023-7-26 22:47:19 | 显示全部楼层 |阅读模式


我想要做一个匹配的功能,当玩家点击匹配后就会进入匹配列表,匹配人数足够后就会让这些人开一局游戏。

在服务端,我想对这些匹配的玩家进行数据管理,该怎么处理呢?

我试了下,下面这种写法,this.players 似乎只在客户端可用。因为出现了如下报错:

emit event: client_Event_Match_Start error: TypeError: Cannot read property 'players' of undefined


我的代码如下:

export const Event_Match_Start = "Event_Match_Start"


@Core.Class
export default class RoomManager extends Core.Script {
    public players: Set<Gameplay.Player>


    protected onStart(): void {
        this.addNetListen()
    }



    private addNetListen() {
        Events.addClientListener(Event_Match_Start, this.onEventMatchStart);
    }



    public onEventMatchStart(player: Gameplay.Player): void {
        this.players.add(player)
    }


在服务端中,内存会存储一些临时数据,而不会每次都存进数据库,这种操作应该很常见,但是不知道在我们这里如何使用?

有大佬分享下吗?
回复

使用道具 举报

kk 发表于 2023-7-26 23:33:44 | 显示全部楼层
1.服务器做一个监听监听客户端事件
2.客户端玩家点击匹配逻辑时,发送事件给予服务器,服务器奖数据缓存进入列表
3.人数满足时候,服务器派发事件给客户端,让列表玩家进入游戏逻辑
4.我瞎吹水的
回复

使用道具 举报

Othanse 发表于 2023-7-27 09:22:32 | 显示全部楼层
想在服务端管理所有玩家的数据,可以通过Events.addPlayerJoinedListener() 函数来监听玩家进入房间事件,在回调中把玩家放到列表里面就可以得到所有玩家。当然也要记得玩家离开房间后从列表中删除,示例代码:
    // 定义一个playerList成员变量,用于存储所有房间内的玩家对象
    private playerList: Set<Gameplay.Player>;

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        // 玩家进入房间监听
        Events.addPlayerJoinedListener((player)=>{
            this.playerList.add(player)
        });
        // 玩家离开房间监听
        Events.addPlayerLeftListener((player)=>{
            this.playerList.delete(player)
        });
    }

如果还想把Player对象和对应玩家的数据绑定起来,可以使用map来存储player列表,把player对象或者playerid作为key,value是对应player的数据对象。
回复

使用道具 举报

汽汽汽汽水 发表于 2023-7-27 10:09:55 | 显示全部楼层
你这个 players 没有定义,所以会变成 undefined 。要先给他赋值
回复

使用道具 举报

打工人小棋楼主 发表于 2023-7-27 10:10:57 | 显示全部楼层
kk 发表于 2023-7-26 23:33
1.服务器做一个监听监听客户端事件
2.客户端玩家点击匹配逻辑时,发送事件给予服务器,服务器奖数据缓存进 ...

感谢kk,事实上我也是这个思路。
但是我的问题是:“服务器奖数据缓存进入列表”,这个列表似乎不能使用,我把列表放在属性里。
(我的代码没放全,在start函数中,我对数据做了初始化,this.players = new Set()),但是报错显示没这个属性。
emit event: client_Event_Match_Start error: TypeError: Cannot read property 'players' of undefined
回复

使用道具 举报

汽汽汽汽水 发表于 2023-7-27 10:15:02 | 显示全部楼层
另外对于玩家对象,最好不要直接缓存玩家,因为纯在上下线等操作删起来比较麻烦。 建议缓存玩家的 playerId,用的时候用 getPlayer 去找。如果找不到就是下线了。
回复

使用道具 举报

打工人小棋楼主 发表于 2023-7-27 10:15:29 | 显示全部楼层
Othanse 发表于 2023-7-27 09:22
想在服务端管理所有玩家的数据,可以通过Events.addPlayerJoinedListener() 函数来监听玩家进入房间事件, ...

感谢Othanse,我的需求是这样的。
加入游戏,假设设置上限为50人,他们会出生在一个广场里玩耍。
然后点击匹配,他们才进入匹配房间:大约10人一个房间。
然后人数足够,10人就开始比赛。
所以我这里的房间概念可能和你说的不太一样。

但是这不是重点,重点是我的this.playerList为什么不能使用。
(我的代码没放全,在start函数中,我对数据做了初始化,this.players = new Set()),但是报错显示没这个属性。
emit event: client_Event_Match_Start error: TypeError: Cannot read property 'players' of undefined
回复

使用道具 举报

打工人小棋楼主 发表于 2023-7-27 10:17:13 | 显示全部楼层
Othanse 发表于 2023-7-27 09:22
想在服务端管理所有玩家的数据,可以通过Events.addPlayerJoinedListener() 函数来监听玩家进入房间事件, ...

另外想请教下,在同一个类里面能 同时执行s + c双端,这是什么技术,底层逻辑有地方可以了解下吗。
回复

使用道具 举报

Othanse 发表于 2023-7-27 10:18:28 | 显示全部楼层
打工人小棋 发表于 2023-7-27 10:15
感谢Othanse,我的需求是这样的。
加入游戏,假设设置上限为50人,他们会出生在一个广场里玩耍。
然后点 ...

好的,那可以贴一下完整的代码哈,另外也需要确定脚本挂载到场景中设置是在哪一端的(双端还是服务端还是客户端的)
回复

使用道具 举报

Othanse 发表于 2023-7-27 10:19:32 | 显示全部楼层
打工人小棋 发表于 2023-7-27 10:17
另外想请教下,在同一个类里面能 同时执行s + c双端,这是什么技术,底层逻辑有地方可以了解下吗。 ...

不是什么特别的技术哈,把文档放一份到服务端,放一份到客户端,这样两端都会执行这个脚本了
回复

使用道具 举报

72小时热榜
热门版块
快速回复 返回顶部 返回列表