写点什么

Rust 元宇宙 8—— 脚本

作者:Miracle
  • 2021 年 11 月 30 日
  • 本文字数:1113 字

    阅读完需:约 4 分钟

Rust 元宇宙 8—— 脚本

为了让我们游戏世界显得有生气,理论上来说,应该有很多玩家(机器人)在世界里进进出出,来来回回。但是我们的元宇宙暂时还没有玩家,所以,我们需要创建一些角色进入和离开游戏世界,比如说下面的代码:


let mut w = World::new(1024);w.enter(1, Position{x: 10000, y: 2000});w.enter(2, Position{x: 100.0, y: 2000});
复制代码


硬编码任何时候都不是一个好主意,特别是对于一个不断变化的元宇宙来说。

传统的游戏服务器开发来说,C++的服务器框架 加上 lua 的脚本是一个理想的组合,能够在性能和灵活性之间达到平衡。

当然 网易的 cloud 在这条路上走的非常远,使用 C++底层加上 lua 的框架,实现了整体游戏逻辑用 lua 语言来实现,这种方案对于框架本身完全满足需求的 游戏没问题,如果需求不足够,那就麻烦了,毕竟理解一个框架的代价,有时候比写一个框架还要高。


Rust 也有自己的 lua 语言绑定,但是既然选择了 Rust,我们就不太愿意使用第三方的解决方案了,目前除了可有可无的 SDL2.0 之外,我们没有使用任何非 Rust 的库,所以这里我们也选择纯 Rust 的脚本解决方案 阿海,rhai。


在游戏开发中使用脚本语言,最早要从 魔兽世界的界面插件开始了,bigfoot 就是一个典型的 lua 脚本插件集合,可以实现自动拾取,寻路等等功能。

一般而言有两种方式来使用脚本,一种是整体框架使用 c/c++,或者 go 或者 java,然后用脚本来实现某些界面或者游戏逻辑,还有一种就是 整体使用脚本语言来描述游戏世界,对性能特别 care 的一些函数,用 c/c++来实现。绝大多数游戏开放商选择的是第一种,除了 cloud。。。


借助于 Rust 语言强大的表达能力和匿名函数,我们只需要下面几行简单的代码,就可以在游戏世界里面嵌入基础的脚本语言了:

   let mut engine = rhai::Engine::new();    let h = handler.clone();    engine.register_fn("enter", move |id: i64, x: f64, y: f64| {        h.send(WorldRequest::Enter(id as u32, Position{x: x as f32, y: y as f32})).ok();        ()    });    let h = handler.clone();    engine.register_fn("leave", move |id: i64| {        h.send(WorldRequest::Leave(id as u32)).ok();        ()    });    let h = handler.clone();    engine.register_fn("move", move |id: i64, x: f64, y: f64, s: f64| {        h.send(WorldRequest::Move(id as u32, Position{x: x as f32, y: y as f32}, s as f32)).ok();        ()    });
复制代码

通过 crossbeam 的 channel,我们注册了三个匿名函数,可以直接在脚本语言里面使用

enter(id, x, y), 创建一个 角色 ID,进入游戏世界,位置为 x,y

leave(id),角色 ID 离开

move(id, x, y, s) 移动 角色 ID 到指定位置 (x,y),速度为 s


用户头像

Miracle

关注

三十年资深码农 2019.10.25 加入

还未添加个人简介

评论

发布
暂无评论
Rust 元宇宙 8—— 脚本