写点什么

Rust 元宇宙 17 —— 聊天和表情

作者:Miracle
  • 2021 年 12 月 12 日
  • 本文字数:1434 字

    阅读完需:约 5 分钟

Rust 元宇宙 17 —— 聊天和表情

我们已经成功的建立了一个元宇宙的基础结构,看起来这玩意平平无奇,只是几行文字在屏幕上移动而已,但是在这简单的图景背后我们实际上已经建立了下面这些元宇宙服务器必不可少的基础结构:


  • 我们实现了基于区域的成员管理,这样任何时候,我们可以快速的知道每个成员的周围有哪些成员


不要小看这一点,这是所有游戏服务器的基础,也是很难解决的问题,很多游戏,比如说魔兽世界,仅仅是

为了维持和计算野外和副本里面的玩家位置,就需要一整个服务器集群。


  • 我们实现了功能的可插入服务结构,目前元宇宙世界有两个服务:


  1. 维持角色位置的 world 服务,注意,我们目前整个元宇宙只有一个 world,但是我们的结构是完全可扩展的,有多少个场所,包括副本,房间,就可以启动多少个 world 服务,甚至这些服务器可以跨机器部署,这样,我们元宇宙的整体架构是可以支持无限多人,只要增加 world 服务的 数量就行了。

  2. 维持玩家 Websock 连接,以及登录信息的 agent 服务


以后 我们可以增加战斗服务,换装服务,包裹服务。。。。

服务之间完全是通过 channel 来通讯的,所以,任何一个服务出现问题,都不会影响其他服务,比如说 包裹服务挂了,那也仅仅是打不开背包而已。


  • 我们实现了 基于 Websocket 和 MessagePack 的 连接协议,这样不管 App 还是网页都可以快速高效的接入我们的元宇宙服务器


  • 我们实现了基于 Serde 和 MessagePack 的持续化机制


  • 我们集成了一个强大的 rhai 脚本引擎


  • 我们在服务器实现了可视化的监视窗口(不要小看这一点,这是多少游戏服务器梦寐以求的功能)


自卖自夸了半天,那么,这个架构的强大之处在哪里呢,我们增加一个简单的功能。

在元宇宙里面,最常见的一件事情,是虚拟角色会做出一些表情,或者动作,这些表情或者动作 需要让周围的人看到,我们来实现这个功能:

首先增加一个协议 Shout,说话周围人能听到,表情和换装除了信息结构更多以外,实现的方法跟 shout 是一样的

pub enum AgentMsg {    LoginOk(u32, Player),    LoginFail(String),    Logout,    Notify(NotifyType),    Shout(String),}
复制代码


这个协议应该是由 world 服务来处理的,因为只有 world 服务才知道 角色周围的玩家有哪些。所以我们增加一个 world 服务的请求 Broadcast,将指定的消息广播给周围的人

pub enum WorldRequest {    Exit,    Enter(u32, Position),    Leave(u32),    Move(u32, Position, f32),    Stop(u32),    Broadcast(u32, AgentMsg)}
复制代码


处理这个请求的代码如下:

   WorldRequest::Broadcast(id, msg)=> {       self.get_role(&id).map(|r|           share::rpc::run(caller, AgentRequest::Broadcast(r.neighbor.clone(), msg))       );   }
复制代码

我们看到,这里转发了需要广播的消息给 agent 服务,因为只有 agent 才拥有 某个 id 玩家的 Websocket 端口。

agent 服务处理这个消息的代码如下

 AgentRequest::Broadcast(ids, msg)=> {     for id in &ids {         self.id_txs.get(id).map(|tx| tx.send(msg.clone()));     } }   
复制代码

简单的转发就可以了。

功能到这里就完成了,为了测试,我们加上一个 脚本支持,注册一个 shout 函数

let c = caller.clone();engine.register_fn("shout", move |id: i64, words: String| {    share::rpc::call(&c, WorldRequest::Broadcast(id as u32, AgentMsg::Shout(words)));});
复制代码

这样执行 shout(id, msg),就可以 向周围的人大喊大叫。

换装和表情也就类似了


最后,我们录制一段视频,show 一下目前的工作,登录 3 个客户端,移动,大喊大叫


发布于: 21 小时前阅读数: 57
用户头像

Miracle

关注

三十年资深码农 2019.10.25 加入

还未添加个人简介

评论

发布
暂无评论
Rust 元宇宙 17 —— 聊天和表情